Metainformationen zur Seite
- Deutsch (de)
- English (en)
SmartHomeNG REST API anbinden
In diesem Beitrag wird die Konfiguration der REST-Schnittstelle beschrieben und wie sie beispielsweise benutzt werden kann.
Use Case - Überblick
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.
SmartHomeNG konfigurieren
Zwei Schritte sind in SmartHomeNG notwendig:
- REST-API aktivieren
- Item zum Beschreiben anlegen
Das Datenbank-Plugin muss natürlich ebenfalls aktiviert und funktionstüchtig sein.
REST aktivieren
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.
- etc/plugin.yaml
webservices: class_name: WebServices class_path: plugins.webservices webservices: enabled: 'True' port: '8383' use_service_auth: false mode: set
Item anlegen
Beispiel Item:
- testitem.yaml
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.
RaspberryPI konfigurieren
Der Raspberry sollte mit dem bekannten Betriebssystem Raspbian installiert sein. Die Befehle basieren darauf.
Module installieren
Für den DHT11 Sensor:
sudo pip3 install adafruit-circuitpython-dht
Für den REST-Aufruf:
pip install requests
Code
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)
Automatisieren
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.