openHAB – Wetterdaten zu OpenWeatherMap schicken (Python-Script)

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 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.