Es gibt in openHAB ein Binding, um OpenWeatherMap anzuzapfen, um die aktuellen Wetterdaten zu erhalten.
Ich wollte aber auch OpenWeatherMap mit meinen eigenen Daten befüttern, da die Daten für meinen Standort etwas dürftig sind.
Da das Binding es nicht kann, hab ich mich eben an was eigenem versucht.
Weil meine Homepage auch mein eigenes Notizbuch für Gedanken ist, habe ich hier mein „Werk“ einmal veröffentlicht.
Eventuell hilft es ja jemanden weiter 🙂
Kann ich Python programmieren?
Nein.
Wie hab ich das Script erstellt?
Ich habe Suchmaschinen und KI-Tools wie ChatGPT, Google Bard & Co. nach Lösungen gefragt.
Nach stundenlangem testen und probieren, den Support von OpenWeatherMap angeschrieben und mich für die Grütze an Dokumentation beschwert, habe ich das Script dann mal hin bekommen.
Warum Python?
Hab mich mal eben daran versucht.
Scheint ja irgendwie geklappt zu haben.
WICHTIG:
Dieses Script ist an für einen eingefleischten Programmierer sicher Geschmier erster Klasse.
Für mich scheint es ja zu funktionieren.
Falls du es besser hin bekommst, den ein oder anderen Fehler gefunden und behoben hast, lass es mich gerne wissen.
WICHTIG 2:
Sollte es Probleme geben, versuche sie selbst zu Lösen!
Da dies ein Bastel-Script ist, biete ich absolut keine Hilfe an.
Was brauchen wir?
– Eine openHAB-Instanz, bei welcher die API frei zugänglich ist
– Ein OpenWeahterMap API-Schlüssel (Ein kostenloser Account reicht)
– Internet
– numpy muss installiert sein (pip install numpy
)
Das Script:
# Notwendige Quellen werden importiert import requests # Für openHAB URL-Zusammenbau import argparse # Braucht mal halt import json # Weil openHAB json spricht import datetime # Uhrzeit import math # Für Uhrzeit import numpy as np # Für String zu Float64 ############## # KONFIGURATION ############## # Basis-URL von openHAB für Abfragen # HTTP erforderlich, sofern ein selbst signiertes Zertifikat genutzt wird OPENHAB_URL = "http://192.168.1.1:8080/rest/items/" # OpenWeatherMap Zugangsdaten OWM_API_URL = "https://api.openweathermap.org/data/3.0/measurements" OWM_API_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" OWM_STATION_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # Items von openHAB, die für die Abfrage genutzt werden sollen: OPENHAB_ITEM_AUSSEN_TEMPERATUR = "ItemNameVonDeinemTemperaturSensor" OPENHAB_ITEM_AUSSEN_LUFTFEUCHTIGKEIT = "ItemNameVonDeinemLuftfeuchtigkeitsSensor" ############## # LOS GEHTS ############## # Item-URLs zusammenbauen und als Variable ausgeben AUSSEN_TEMPERATUR = OPENHAB_URL + OPENHAB_ITEM_AUSSEN_TEMPERATUR AUSSEN_LUFTFEUCHTIGKEIT = OPENHAB_URL + OPENHAB_ITEM_AUSSEN_LUFTFEUCHTIGKEIT ############## # AUSSEN ############## response = requests.get(AUSSEN_TEMPERATUR) # Verarbeite die Antwort der REST-API if response.status_code == 200: # Der Item-Wert ist verfügbar value = response.json()["state"] print(value) STATUS_AUSSEN_TEMPERATUR = response.json()["state"] else: # Der Item-Wert ist nicht verfügbar print("Item nicht verfügbar") response = requests.get(AUSSEN_LUFTFEUCHTIGKEIT) # Verarbeite die Antwort der REST-API if response.status_code == 200: # Der Item-Wert ist verfügbar value = response.json()["state"] print(value) STATUS_AUSSEN_LUFTFEUCHTIGKEIT = response.json()["state"] else: # Der Item-Wert ist nicht verfügbar print("Item nicht verfügbar") print("___________________________________") ############## # ZEIT AUSGEBEN ############## now = datetime.datetime.now() timestamp = now.timestamp() timestamp_ganzzahl = math.floor(timestamp) print("Uhrzeit:", timestamp_ganzzahl) print("___________________________________") ############## # API ABFRAGE ############## # FLOAT64-KONVERTIERUNG # Notwendig, weil openHAB ggf. Strings ausgibt, OpenWeatherMap aber nur Float erlaubt STATUS_AUSSEN_TEMPERATUR_FLOAT64 = np.float64(STATUS_AUSSEN_TEMPERATUR) STATUS_AUSSEN_LUFTFEUCHTIGKEIT_FLOAT64 =np.float64(STATUS_AUSSEN_LUFTFEUCHTIGKEIT) # Print the result print("Float64", STATUS_AUSSEN_TEMPERATUR_FLOAT64) print("Float64", STATUS_AUSSEN_LUFTFEUCHTIGKEIT_FLOAT64) print("___________________________________") querystring = {"appid":OWM_API_KEY} payload = [ { "station_id": OWM_STATION_ID, "dt": timestamp_ganzzahl, "temperature": STATUS_AUSSEN_TEMPERATUR_FLOAT64, "humidity": STATUS_AUSSEN_LUFTFEUCHTIGKEIT_FLOAT64 } ] headers = {"Content-Type": "application/json"} response = requests.request("POST", OWM_API_URL, json=payload, headers=headers, params=querystring) print(response.text)
Wie funktioniert das Script?
1. Speichere das Script in einer Python-Datei (openhab-zu-openweathermap.py) ab.
2. Setze bei den Variablen im Abschnitt „KONFIGURATION“ die korrekte URL zu openHAB, dein OpenWeahterMap API-Key und eine Station-ID.
3. Füge die korrekten Item-Namen für Temperatur und Luftfeuchtigkeit ein.
4. Lass das Script laufen.
CronJob erwünscht?
Hier findest du ein einfaches Bash-Script, was das Python-Script startet.
Man muss scheinbar den Weg gehen, damit das Python-Script ausgeführt werden kann.
Auf meinem Raspberry Pi hat es nur so funktioniert.
/usr/bin/python3 /home/pi/openhab-zu-openweathermap.py
Wie registriere ich eine Station?
Ich habe es mit Hilfe des Tools „Insomnia“ hin bekommen.
Hier sind Screenshots von meinen Einstellungen.
Kann ich meine Daten abfragen?
Ich glaube nein. Bisher hab ich nur Dokumentationen zu „OneCall“ gefunden, was die Bezahl-API ist.
Das bekommt man mit dem kostenlosen Account scheinbar nicht hin.
Ich habe einen Fehler!
Hier zwei Lösungen: LÖSUNG1 LÖSUNG2 LÖSUNG3
Warum ist das Script nicht auf GitHub / GitLab?
Hier gehts doch auch. Da ich auch das Ding alleine gebaut habe, brauch ich dafür kein GitHub oder GitLab.
Ich kann das bisschen Script 1000x besser!!!!111elf
Dann bau es gerne um und stell es der Welt zur Verfügung 🙂