From f556189a0b7726360d3278c90798f2e8e820774d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maik=20Mu=CC=88ller?= Date: Fri, 26 Apr 2024 15:54:57 +0200 Subject: [PATCH] running with two sensors --- device_info.py | 34 ++++++++++++++++++++++++++++++++++ dht22.py | 15 +++++++++------ grow_system.py | 39 +++++++++++++++++++++++++++++++-------- grow_system_api.py | 29 +++++++++++++++++++++++++++++ http_client.py | 35 +++++++++++++++++++++++++++++++++++ main.py | 32 +++++++++++++++++++++++++++++++- moisture_sensor.py | 13 ++++++++----- sensor_data_manager.py | 19 +++++++++++++++++++ wlan.py | 22 ++++++++++++++-------- 9 files changed, 210 insertions(+), 28 deletions(-) create mode 100644 device_info.py create mode 100644 grow_system_api.py create mode 100644 http_client.py create mode 100644 sensor_data_manager.py diff --git a/device_info.py b/device_info.py new file mode 100644 index 0000000..89c0474 --- /dev/null +++ b/device_info.py @@ -0,0 +1,34 @@ +import network + + +class DeviceInfo: + + name = "Dev Device 1" + + token = "PC]-0Bmp83h7F5#U!D6KJ(A&" + + wlan = network.WLAN(network.STA_IF) + + def get_macaddress(self): + return self._format_mac(self.wlan.config('mac').hex()) + + def get_ipaddress(self): + return self.wlan.ifconfig()[0] + + def get_all_device_infos(self): + return { + 'name': self.name, + 'mac_address': self.get_macaddress(), + 'ip_address': self.get_ipaddress(), + 'token': self.token} + + def _format_mac(self, mac): + # Split the MAC address into pairs of two characters each + pairs = [mac[i:i+2] for i in range(0, len(mac), 2)] + # Join the pairs with colons to create the formatted MAC address + formatted_mac = ":".join(pairs) + return formatted_mac + + + + \ No newline at end of file diff --git a/dht22.py b/dht22.py index 37cc79e..9f6a22a 100644 --- a/dht22.py +++ b/dht22.py @@ -7,7 +7,7 @@ class TemperatureHumiditySensor: dht22_sensor = None - most_recent_values = {} + most_recent_values = [] def __init__(self, settings): print("Hello from dht22 sensor class") @@ -18,15 +18,18 @@ class TemperatureHumiditySensor: def read(self): try: self.dht22_sensor.measure() - self.most_recent_values = { - 'temperature': { + self.most_recent_values = [ + { + 'type': 'temperature', 'value': self.dht22_sensor.temperature(), - 'unit': '°C'}, - 'humidity': { + 'unit': 'C' + }, + { + 'type': 'humidity', 'value': self.dht22_sensor.humidity(), 'unit': '%' } - } + ] except OSError: print('DHT22 Error reading temperature/humidity. Check wires') print() diff --git a/grow_system.py b/grow_system.py index 38b64bb..f553d9f 100644 --- a/grow_system.py +++ b/grow_system.py @@ -1,18 +1,24 @@ import time from moisture_sensor import MoistureSensor from dht22 import TemperatureHumiditySensor +from sensor_data_manager import SensorDataManager +from grow_system_api import GrowSystemApi class GrowSystem: + grow_system_api = GrowSystemApi() + moisture_sensor = None temperature_humidity_sensor = None - most_recent_values = {} + most_recent_values = [] + + sensor_data_manager = None + + device_id = None - def __init__(self, settings): - print("hello from GrowSystem") - print(settings) + def __init__(self, settings): if not self.moisture_sensor: self.moisture_sensor = MoistureSensor(settings['moisture_sensor']) @@ -20,16 +26,33 @@ class GrowSystem: self.temperature_humidity_sensor = TemperatureHumiditySensor(settings['temperature_humidity_sensor']) def start(self): + print("Say the server hello...") + result = self.grow_system_api.say_hello() + message = result['message'] + + if message != 'OK': + print("Device not activated. Stopping") + return + + self.device_id = result['data']['device_id'] + self.sensor_data_manager = SensorDataManager(self.device_id) + print("Start reading sensors ...") while True: + # Reset data + self.most_recent_values = [] # Moisture Sensor self.moisture_sensor.read() - self.most_recent_values['moisture_sensor'] = self.moisture_sensor.most_recent_value + self.most_recent_values = self.most_recent_values + self.moisture_sensor.most_recent_value # Temperature and Humidity Sensor self.temperature_humidity_sensor.read() - self.most_recent_values['temperature_humidity_sensor'] = self.temperature_humidity_sensor.most_recent_values - + self.most_recent_values = self.most_recent_values + self.temperature_humidity_sensor.most_recent_values + + print("Most recent bla") print(self.most_recent_values) - time.sleep(1) + + self.sensor_data_manager.handleData(self.most_recent_values) + + time.sleep(5) diff --git a/grow_system_api.py b/grow_system_api.py new file mode 100644 index 0000000..dbd4aff --- /dev/null +++ b/grow_system_api.py @@ -0,0 +1,29 @@ +from http_client import HTTPClient +from device_info import DeviceInfo +import json + + +class GrowSystemApi: + + http_client = HTTPClient() + + device_info = DeviceInfo() + + base_url = 'api.growsystem.muellerdev.kozow.com' + + def say_hello(self): + data = self._get_device_data() + response = self.http_client.post(self.base_url + "/api/device", data) + jsonResult = json.loads(response.text) + print(jsonResult) + return jsonResult; + + def send_measurements(self, device_id, data): + url = self.base_url + "/api/device/" + str(device_id) + "/sensor-log" + print(url) + response = self.http_client.post(url, data) + return json.loads(response.text) + + def _get_device_data(self): + return self.device_info.get_all_device_infos() + diff --git a/http_client.py b/http_client.py new file mode 100644 index 0000000..fd197ed --- /dev/null +++ b/http_client.py @@ -0,0 +1,35 @@ +import urequests +import json + +class HTTPClient: + def __init__(self): + pass + + def get(self, url): + url = 'https://' + url + try: + # headers = {'Content-Type': 'application/json'} + response = urequests.get(url) + if response.status_code == 200: + print("Data sent, got response") + return response + else: + print("Failed to get data. Status code:", response.status_code) + except Exception as e: + print("Exception occurred:", e) + + def post(self, url, data): + url = 'https://' + url + try: + headers = {'Content-Type': 'application/json', 'Accept': 'application/json, text/plain, */*'} + json_data = json.dumps(data) + print("Send post request to: " + url) + response = urequests.post(url, data=json_data, headers=headers) + if response.status_code == 200: + return response + else: + print("Failed to send data. Status code:", response.status_code) + print(response.text) + except Exception as e: + print("Exception occurred:", e) + diff --git a/main.py b/main.py index 8b0557d..3f6e225 100644 --- a/main.py +++ b/main.py @@ -5,8 +5,15 @@ # This file should do only: # - provide constants for settings # - eventually necessary system settings +# - init wlan connection # - Call base class, permitting the configured constants +import network +import urequests from grow_system import GrowSystem +from wlan import WlanClient +from http_client import HTTPClient +from device_info import DeviceInfo + settings = { 'wlan_ssid': 'Oppa-95.lan', @@ -20,10 +27,33 @@ settings = { 'pump_pin_int': 24 } + +def wlan_scan(): + # Client-Betrieb + wlan = network.WLAN(network.STA_IF) + # WLAN-Interface aktivieren + wlan.active(True) + # WLANs ausgeben + found_wlans = wlan.scan() + return found_wlans + + # Press the green button in the gutter to run the script. if __name__ == '__main__': + #print(wlan_scan()) + print("Connect WLAN") + wlanClient = WlanClient(settings['wlan_ssid'], settings['wlan_pw']) + wlanClient.connect() + print("---------------------------------------") + print("") + + di = DeviceInfo() + print("Device Infos:") + print(di.get_all_device_infos()) + print("---------------------------------------") + print("") + print("Start grow system") gs = GrowSystem(settings) gs.start() - # See PyCharm help at https://www.jetbrains.com/help/pycharm/ diff --git a/moisture_sensor.py b/moisture_sensor.py index a7e6deb..851aaea 100644 --- a/moisture_sensor.py +++ b/moisture_sensor.py @@ -7,7 +7,7 @@ class MoistureSensor: moisture_sensor = None - most_recent_value = -1 + most_recent_value = [] def __init__(self, moisture_sensor_data): self.moisture_sensor_pin_int = moisture_sensor_data['pin_int'] @@ -15,7 +15,10 @@ class MoistureSensor: self.moisture_sensor = ADC(Pin(self.moisture_sensor_pin_int)) def read(self): - self.most_recent_value = self.moisture_sensor.read_u16() - - - + self.most_recent_value = [ + { + 'type': 'moisture', + 'value': self.moisture_sensor.read_u16(), + 'unit': 'unknown' + }, + ] diff --git a/sensor_data_manager.py b/sensor_data_manager.py new file mode 100644 index 0000000..f670d93 --- /dev/null +++ b/sensor_data_manager.py @@ -0,0 +1,19 @@ +from grow_system_api import GrowSystemApi + + +class SensorDataManager: + + grow_system_api = None + + base_url = 'api.growsystem.muellerdev.kozow.com' + + device_id = None + + def __init__(self, device_id): + self.grow_system_api = GrowSystemApi() + self.device_id = device_id + + def handleData(self, data): + jsonResponse = self.grow_system_api.send_measurements(self.device_id, data) + print("---- Response: -----") + print(jsonResponse) \ No newline at end of file diff --git a/wlan.py b/wlan.py index 5050ba7..c265d8e 100644 --- a/wlan.py +++ b/wlan.py @@ -1,7 +1,6 @@ import machine import network import time - # network.country('DE') @@ -9,25 +8,32 @@ class WlanClient: ssid = '' pw = '' - wlan = network.WLAN(network.STA_IF) + wlan = None # Status-LED led_onboard = machine.Pin('LED', machine.Pin.OUT) led_onboard.value(False) def __init__(self, ssid, pw): + # print("Hello from wlan class") self.ssid = ssid self.pw = pw + self.wlan = network.WLAN(network.STA_IF) def connect(self): - if not self.isConnected(): - print('No WLAN connected. Connecting ...') + if not self.is_connected(): + print('No WLAN connected. Connecting ...' + self.ssid + ' ' + self.pw) self.wlan.active(True) self.wlan.connect(self.ssid, self.pw) for i in range(10): if self.wlan.status() < 0 or self.wlan.status() >= 3: break - led_value = self.led_onboard.value() == 1 - self.led_onboard.value(led_value) + time.sleep(1) + # led_value = self.led_onboard.value() == 1 + # self.led_onboard.value(led_value) + if self.wlan.isconnected(): + net_config = self.wlan.ifconfig() + print("NetConfig:") + print(net_config) - def isConnected(self): - return self.wlan.isconnected() \ No newline at end of file + def is_connected(self): + return self.wlan.isconnected()