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:

  1. REST-API aktivieren
  2. 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:

  1. import adafruit_dht
  2. import board
  3. import requests
  4.  
  5. # Set up the DHT sensor (DHT11 in this case)
  6. dhtDevice = adafruit_dht.DHT11(board.D23) # GPIO pin 23
  7.  
  8. # Function to write value to SmartHomeNG
  9. def write_value_to_item(url, value):
  10. headers = {'Content-Type': 'application/json'}
  11. try:
  12. response = requests.put(url, data=str(value), headers=headers)
  13. if response.status_code == 200:
  14. print("Wert erfolgreich geschrieben!")
  15. else:
  16. print(f"Fehler beim Schreiben des Werts. Status Code: {response.status_code}")
  17. except Exception as e:
  18. print(f"Ein Fehler ist aufgetreten: {e}")
  19.  
  20. # URLs for the SmartHomeNG REST interface
  21. temperature_url = "http://<url_zu_shng>:8383/rest/items/Temperatur"
  22. humidity_url = "http://<url_zu_shng>:8383/rest/items/Luftfeuchtigkeit"
  23.  
  24. def read_sensor():
  25. try:
  26. # Read the sensor values
  27. temperature = dhtDevice.temperature
  28. humidity = dhtDevice.humidity
  29.  
  30. if humidity is not None and temperature is not None:
  31. print(f"Temperature: {temperature}°C Humidity: {humidity}%")
  32. return temperature, humidity
  33. else:
  34. print("Failed to retrieve data from sensor")
  35. return None, None
  36.  
  37. except RuntimeError as error:
  38. print(error.args[0])
  39. return None, None
  40.  
  41. # Attempt to read the sensor values
  42. temperature, humidity = read_sensor()
  43.  
  44. # Retry if temperature or humidity is 0 or None
  45. while (temperature is None or temperature == 0) or (humidity is None or humidity == 0):
  46. print("Retrying to read the sensor...")
  47. temperature, humidity = read_sensor()
  48.  
  49. # Write the temperature value to SmartHomeNG
  50. if temperature is not None:
  51. write_value_to_item(temperature_url, temperature)
  52.  
  53. # Write the humidity value to SmartHomeNG
  54. if humidity is not None:
  55. 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.