In diesem Beitrag wird die Konfiguration der REST-Schnittstelle beschrieben und wie sie beispielsweise benutzt werden kann.
An einem Raspberry Pi ist ein Sensor über GPIO angeschlossen, in diesem Beispiel ein DHT11 Temperatur- und Luftfeuchtigkeitssensor. Die aufgezeichneten Daten sollen an ein bestehendes SmartHomeNG-System gesendet werden. Dazu wird die REST API von SmartHomeNG verwendet.
Zwei Schritte sind in SmartHomeNG notwendig:
Das Datenbank-Plugin muss natürlich ebenfalls aktiviert und funktionstüchtig sein.
In SmartHomeNG muss das Plugin webservices aktiviert werden. Dazu in der SmartHomeNG Installation die plugin.yaml im Verzeichnis etc öffnen und folgenden Eintrag hinzufügen. Die Einrückungen bei yaml sind zu beachten.
webservices: class_name: WebServices class_path: plugins.webservices webservices: enabled: 'True' port: '8383' use_service_auth: false mode: set
Beispiel Item:
Temperatur: name: Temperatur type: num database: 'yes' webservices_set: true enforce_updates: true Luftfeuchtigkeit: name: Luftfeuchtigkeit type: num database: 'yes' webservices_set: true enforce_updates: true
SmartHomeNG Dienst neu starten.
Der Raspberry sollte mit dem bekannten Betriebssystem Raspbian installiert sein. Die Befehle basieren darauf.
Für den DHT11 Sensor:
sudo pip3 install adafruit-circuitpython-dht
Für den REST-Aufruf:
pip install requests
Python Code:
import adafruit_dht import board import requests # Set up the DHT sensor (DHT11 in this case) dhtDevice = adafruit_dht.DHT11(board.D23) # GPIO pin 23 # Function to write value to SmartHomeNG def write_value_to_item(url, value): headers = {'Content-Type': 'application/json'} try: response = requests.put(url, data=str(value), headers=headers) if response.status_code == 200: print("Wert erfolgreich geschrieben!") else: print(f"Fehler beim Schreiben des Werts. Status Code: {response.status_code}") except Exception as e: print(f"Ein Fehler ist aufgetreten: {e}") # URLs for the SmartHomeNG REST interface temperature_url = "http://<url_zu_shng>:8383/rest/items/Temperatur" humidity_url = "http://<url_zu_shng>:8383/rest/items/Luftfeuchtigkeit" def read_sensor(): try: # Read the sensor values temperature = dhtDevice.temperature humidity = dhtDevice.humidity if humidity is not None and temperature is not None: print(f"Temperature: {temperature}°C Humidity: {humidity}%") return temperature, humidity else: print("Failed to retrieve data from sensor") return None, None except RuntimeError as error: print(error.args[0]) return None, None # Attempt to read the sensor values temperature, humidity = read_sensor() # Retry if temperature or humidity is 0 or None while (temperature is None or temperature == 0) or (humidity is None or humidity == 0): print("Retrying to read the sensor...") temperature, humidity = read_sensor() # Write the temperature value to SmartHomeNG if temperature is not None: write_value_to_item(temperature_url, temperature) # Write the humidity value to SmartHomeNG if humidity is not None: write_value_to_item(humidity_url, humidity)
Mithilfe eines Cronjobs kann das Skript periodisch in gewünschten Abständen ausgeführt werden. Sofern sich der Wert nicht ändert, wird auch kein Datensatz im DB-Plugin von SmartHomeNG erzeugt.