From 302071473f21246dc4486219f683ffac16444954 Mon Sep 17 00:00:00 2001 From: ferdzo Date: Sun, 29 Oct 2023 22:07:24 +0100 Subject: [PATCH] Initial commit --- .gitignore | 0 db.sqlite3 | Bin 0 -> 131072 bytes demo.db | Bin 0 -> 28672 bytes iotDashboard/__init__.py | 0 iotDashboard/asgi.py | 16 ++++ iotDashboard/getInfoFromDevices.py | 12 +++ iotDashboard/models.py | 17 ++++ iotDashboard/settings.py | 134 +++++++++++++++++++++++++++++ iotDashboard/urls.py | 24 ++++++ iotDashboard/views.py | 18 ++++ iotDashboard/wsgi.py | 16 ++++ manage.py | 22 +++++ proba.py | 47 ++++++++++ 13 files changed, 306 insertions(+) create mode 100644 .gitignore create mode 100644 db.sqlite3 create mode 100644 demo.db create mode 100644 iotDashboard/__init__.py create mode 100644 iotDashboard/asgi.py create mode 100644 iotDashboard/getInfoFromDevices.py create mode 100644 iotDashboard/models.py create mode 100644 iotDashboard/settings.py create mode 100644 iotDashboard/urls.py create mode 100644 iotDashboard/views.py create mode 100644 iotDashboard/wsgi.py create mode 100644 manage.py create mode 100644 proba.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..447433f36a7a26c638ced9ce00f0292c12661815 GIT binary patch literal 131072 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 literal 0 HcmV?d00001 diff --git a/iotDashboard/__init__.py b/iotDashboard/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/iotDashboard/asgi.py b/iotDashboard/asgi.py new file mode 100644 index 0000000..fcb9cb9 --- /dev/null +++ b/iotDashboard/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for iotDashboard project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'iotDashboard.settings') + +application = get_asgi_application() diff --git a/iotDashboard/getInfoFromDevices.py b/iotDashboard/getInfoFromDevices.py new file mode 100644 index 0000000..6955d74 --- /dev/null +++ b/iotDashboard/getInfoFromDevices.py @@ -0,0 +1,12 @@ +import requests + +devices = {"livingroom":"192.168.1.56"} + +def getTemp(device): + r = requests.get("http://"+devices[device]+"/sensor/temperature") + return r.json()['value'] + +def getHumidity(device): + r = requests.get("http://"+devices[device]+"/sensor/humidity") + return r.json()['value'] + diff --git a/iotDashboard/models.py b/iotDashboard/models.py new file mode 100644 index 0000000..c5cd5ff --- /dev/null +++ b/iotDashboard/models.py @@ -0,0 +1,17 @@ +from django.db import models + +class Device(models.Model): + name = models.CharField(max_length=50) + ip = models.CharField(max_length=20) + protocol = models.CharField(max_length=20) + temperature = models.BooleanField(default=False) + humidity = models.BooleanField(default=False) + brightness = models.BooleanField(default=False) + + + + +class Measurement(models.Model): + temperature = models.CharField(required=False,max_length=10) + humidity = models.CharField(required=False,max_length=10) + brightness = models.CharField(required=False,max_length=10) diff --git a/iotDashboard/settings.py b/iotDashboard/settings.py new file mode 100644 index 0000000..b684f52 --- /dev/null +++ b/iotDashboard/settings.py @@ -0,0 +1,134 @@ +""" +Django settings for iotDashboard project. + +Generated by 'django-admin startproject' using Django 4.2.5. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.2/ref/settings/ +""" +import environ +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + +env = environ.Env(DEBUG=True) + +environ.Env.read_env() + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = env('SECRET_KEY') + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'iotDashboard.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'iotDashboard.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + }, + 'data': { + "ENGINE": "django.db.backends.postgresql", + "NAME" : "example", + "USER": "postgres", + "PASSWORD": env('PASSWORD'), + "HOST": 'localhost', + "PORT": '5432', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.2/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/iotDashboard/urls.py b/iotDashboard/urls.py new file mode 100644 index 0000000..e78e28f --- /dev/null +++ b/iotDashboard/urls.py @@ -0,0 +1,24 @@ +""" +URL configuration for iotDashboard project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path +from iotDashboard import views + +urlpatterns = [ + path('admin/', admin.site.urls), + path('',views.index) +] diff --git a/iotDashboard/views.py b/iotDashboard/views.py new file mode 100644 index 0000000..0ad9fbe --- /dev/null +++ b/iotDashboard/views.py @@ -0,0 +1,18 @@ +from django.http import HttpResponse +from django.db import connections + +def my_custom_sql(): + with connections['data'].cursor() as cursor: + # cursor.execute("SELECT * FROM conditions WHERE device='livingroom';" + cursor.execute("SELECT * FROM conditions WHERE time > NOW() - INTERVAL '50 days' ;") + row = cursor.fetchall() + keys = ("time","device","tempreature","humidity") + return row + + + + +def index(request): + if request.user.is_authenticated: + return HttpResponse(my_custom_sql()) + return HttpResponse("NOT AUTHENTICATED!!!") \ No newline at end of file diff --git a/iotDashboard/wsgi.py b/iotDashboard/wsgi.py new file mode 100644 index 0000000..eba3cf4 --- /dev/null +++ b/iotDashboard/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for iotDashboard project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'iotDashboard.settings') + +application = get_wsgi_application() diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..510a77a --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'iotDashboard.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/proba.py b/proba.py new file mode 100644 index 0000000..81d575a --- /dev/null +++ b/proba.py @@ -0,0 +1,47 @@ +import psycopg2 +from psycopg2 import sql +from datetime import datetime +import requests +from huey import SqliteHuey, crontab + +# Initialize scheduler +huey = SqliteHuey(filename='demo.db') + +# Database connection +CONNECTION = "postgres://postgres:postgres*@localhost:5432/example" +conn = psycopg2.connect(CONNECTION) + +# Devices +devices = {"livingroom": "192.168.1.56","bedroom":"192.168.1.57"} + + +# Func for fetching data from device using REST API +def fetch_data_from_device(device): + data = dict() + data["time"] = datetime.now() + data["device"] = device + r = requests.get("http://" + devices[device] + "/sensor/temperature") + data["temperature"] = r.json()['value'] + r = requests.get("http://" + devices[device] + "/sensor/humidity") + data["humidity"] = r.json()['value'] + return (data["time"], data["device"], data["temperature"], data["humidity"]) + + +# Func for inserting data to database +def insert_data(conn, device): + data = fetch_data_from_device(device) + cursor = conn.cursor() + insert_query = sql.SQL( + "INSERT INTO conditions (time, device, temperature, humidity) " + "VALUES (%s, %s, %s, %s)" + ) + cursor.execute(insert_query, data) + conn.commit() + cursor.close() + print("Done") + + +@huey.periodic_task(crontab(minute='*/1')) +def test(): + for device in devices: + insert_data(conn, device)