Seite 1 von 1

OpenWeatherMap Thing - GPS Variable

Verfasst: 15. Okt 2023 14:42
von bngi
Hallo,
ich möchte in meiner OpenWeatherMap Thing Konfiguration die Koordinaten als Variable übergeben.
Ist das in irgendeiner Form möglich? Aktuell muss ich die Koordinaten in den Thing Einstellungen manuell eingeben. Ziel ist es jedoch, dass diese über GPS übergeben werden sollen.
Längen- und Breitengrad habe ich bereits jeweils als Item in openhabian verfügbar.

Hier die aktuelle Thing Konfiguration:

Code: Alles auswählen

UID: openweathermap:weather-and-forecast:ow:weather_location
label: Wetterinformationen aktueller Ort
thingTypeUID: openweathermap:weather-and-forecast
configuration:
  forecastDays: 0
  location: manuellX,manuellY
  forecastHours: 24
bridgeUID: openweathermap:weather-api:meinaccount

Re: OpenWeatherMap Thing - GPS Variable

Verfasst: 16. Okt 2023 00:43
von udo1toni
Nein, das ist (leider) nicht vorgesehen. Bisher wurde der Ruf nach mobilen openHAB Systemen noch nicht erhört (aber Du bist nicht der Erste, der openHAB im Camper einbauen will)

Re: OpenWeatherMap Thing - GPS Variable

Verfasst: 16. Okt 2023 00:56
von bngi
Ok danke für den Hinweis.
Liegt das Thing irgendwo als Config in Linux vor? Wenn ja, wo?
Ich nutze openhabian.
Entsprechend benannte Ordner habe ich zwar gefunden, es liegt aber nichts drin.

Re: OpenWeatherMap Thing - GPS Variable

Verfasst: 16. Okt 2023 10:00
von udo1toni
:) immer dran denken, es handelt sich um Java, das ist komplett unabhängig vom Betriebssystem. Wenn openHAB per apt installiert ist (openHABian nutzt apt), dann sind die entsprechenden Ordner wie gewohnt verteilt, das heißt, es gibt unter /etc/ verschiedene Dinge, in /etc/openhab/ befindet sich die Textkonfiguration (bis auf die Main UI kann man eigentlich alles komplett über Textdateien konfigurieren) und unter /etc/default/ gibt es eine Datei openhab, die das Startverhalten beeinflusst (welche Ports, wie viel RAM, welche Schnittstellen...). Außerdem gibt es natürlich noch eine openhab.service Datei unter /etc/systemd/system/, weil openHAB ja als Dienst läuft.
Die veränderlichen Dateien befinden sich entsprechend unter /var/lib/openhab/, hier findest Du auch die Dateien, welche für die Things zuständig sind (im Unterverzeichnis jsondb, denn openHAB speichert seine Konfiguration als JSON).
Allerdings möchte ich dringend davon abraten, die Dateien direkt zu manipulieren, denn dann müsstest Du openHAB jedes Mal neu starten, openHAB überwacht diese Dateien nicht auf Veränderungen.

Es gibt stattdessen eine REST API, über die Du das Thing steuern kannst. openHAB bringt über die UI sogar eine Swagger-Dokumentation mit (Main UI->Administration->Entwickler-Tools->API Explorer), Du kannst also direkt herausfinden, welchen Aufruf Du tätigen musst, um die aktuelle Konfiguration auszulesen - z.B. bei mir

Code: Alles auswählen

curl -X 'GET' \
  'https://openhabian:8443/rest/things/openweathermap%3Aweather-and-forecast%3Abridge%3Alocal' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer <mein Token>'
was dann eine json Antwort liefert:

Code: Alles auswählen

{
    "channels": [
        {
            "linkedItems": [
                "WetterDa_StationId"
            ],
            "uid": "openweathermap:weather-and-forecast:bridge:local:station#id",
            "id": "station#id",
            "channelTypeUID": "openweathermap:station-id",
            "itemType": "String",
            "kind": "STATE",
            "label": "Station-ID",
            "description": "Zeigt die ID der Wetterstation oder des Ortes an.",
            "defaultTags": [],
            "properties": {},
            "configuration": {}
        },
        {
            "linkedItems": [],
            "uid": "openweathermap:weather-and-forecast:bridge:local:forecastHours24#snow",
            "id": "forecastHours24#snow",
            "channelTypeUID": "openweathermap:forecasted-snow",
            "itemType": "Number:Length",
            "kind": "STATE",
            "label": "Vorhergesagter Schnee",
            "description": "Zeigt die vorhergesagte Schneemenge an.",
            "defaultTags": [],
            "properties": {},
            "configuration": {}
        }
    ],
    "statusInfo": {
        "status": "ONLINE",
        "statusDetail": "NONE"
    },
	"editable": false,
	"label": "Wetter Darmstadt",
	"bridgeUID": "openweathermap:weather-api:bridge",
	"configuration": {
        "step": 3,
        "location": "49.91,8.66",
        "forecastHours": 24,
        "forecastDays": 0
    },
    "properties": {},
    "UID": "openweathermap:weather-and-forecast:bridge:local",
    "thingTypeUID": "openweathermap:weather-and-forecast"
}
Ich habe die Ausgabe hier mal stark verkürzt :) denn der einzig interessante Teil ist ja ganz am Ende der Ausgabe, die ca. 120 Channel sind eher uninteressant.
Um die Location zu ändern, müsste dann ein Aufruf der Form

Code: Alles auswählen

curl -X 'PUT' \
  'https://openhabian:8443/rest/things/openweathermap%3Aweather-and-forecast%3Abridge%3Alocal' \
  -H 'accept: */*' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <mein Token>' \
  -d '{
    "label": "Wetter anderswo",
    "configuration": {
        "location": "50.91,9.66"
    },
    "UID": "openweathermap:weather-and-forecast:bridge:local",
    "thingTypeUID": "openweathermap:weather-and-forecast"
}'
ausreichen, es kann sogar sein, dass man UID und thingTypeUID sowie (sehr sicher) das Label weg lassen kann. Das JSON kann natürlich auch ohne Zeilenumbrüche und Leerbereiche gesendet werden, hier nur für die Lesbarkeit mit Formatierung.

Ich habe das bei mir nicht ausprobiert, denn wenn Du oben das JSON anschaust, wirst Du feststellen, dass dort das Flag editable auf false steht. Das liegt daran, dass ich mein Wetter Thing über die Textkonfiguration angelegt habe :)
Dies ist die andere Möglichkeit, die nicht offiziell empfohlen wird, aber was soll's ;)

Du legst das Thing STATT über die UI, über Text an, und zwar mittels einer Datei /etc/openhab/things/irgendwas.things:

Code: Alles auswählen

Bridge openweathermap:weather-api:bridge "openweatherMap Api"  [ apikey="<API-Key>", refreshInterval=10, language="de" ] {
    Thing weather-and-forecast local "Wetter Darmstadt"  [ forecastDays=0, forecastHours=24, step=3, location="49.91,8.66" ]
}
und hier kannst Du die Werte natürlich genauso beeinflussen. openHAB liest diese Datei automatisch ein, sobald sie geändert wurde.

ABER.

Es reicht nicht, die Werte zu tauschen. Entweder, Du änderst die UID mit, oder Du leerst die Datei und speicherst sie und setzt anschließend den Wert wieder. Der Punkt ist, dass das Thing für openHAB entfernt und neu erstellt werden muss, damit die Konfiguration sicher neu geladen wird. Du musst also auf jeden Fall zwei Änderungen an der Datei vornehmen, damit es wirklich klappt. Das liegt daran, dass es nicht vorgesehen ist, Things zu bearbeiten. Man hat nur daran gedacht, Things/Channel zu erzeugen oder zu entfernen, nicht, diese anders zu konfigurieren.

Zum manuellen Bearbeiten der Daten ist die Textdatei eleganter, einen Buchstaben an die UID anzuhängen, auf Speichern zu klicken, den Buchstaben wieder zu entfernen und erneut zu speichern ist schnell erledigt, wenn man jedoch ein Programm schreibt, welches das automatisch erledigt, ist der curl-Aufruf mit minimalem Aufwand verbunden.

Wenn es um genau bekannte Standorte geht, kann man natürlich auch für jeden Standort ein Thing anlegen und dieses Thing schlafen schicken :) auch das geht bequem über die API (pausieren deshalb, damit man nicht über die erlaubte Anzahl API Calls für openweathermap kommt - oder man verringert die Anzahl Abrufe pro Tag - kommt ja vor allem drauf an, um wie viele Standorte es geht)

Re: OpenWeatherMap Thing - GPS Variable

Verfasst: 21. Okt 2023 21:08
von bngi
Einfach nur danke für deine Arbeit hier im Forum und die schnellen kompetenten Antworten!

Ich habe es jetzt mittels zweier Shellskripte realisiert, die regelmäßig ausgeführt werden. Vielleicht ist das jetzt nicht die eleganteste Lösung, aber es funktioniert so für mich. :lol:

Ich sende die GPS Koordinaten aus openhab per MQTT und frage diese dann wieder über ein Skript ab... :oops:

Falls andere Bedarf haben, hier die Skripte dazu.

Abfrage der Koordinaten per MQTT und abspeichern dieser:

Code: Alles auswählen

mosquitto_sub -h localhost -t zigbee2mqtt/latitude -C 1 >  /home/openhabian/scripts/latitude
mosquitto_sub -h localhost -t zigbee2mqtt/longitude -C 1 > /home/openhabian/scripts/longitude
Import der Koordinaten in das openhab Thing:

Code: Alles auswählen

read latitude < /home/openhabian/scripts/latitude
read longitude < /home/openhabian/scripts/longitude

gps="$latitude","$longitude"

curl -X 'PUT' \
  'http://IP:8080/rest/things/openweathermap%3Aweather-and-forecast%3Aow%3Aweather_location' \
  -H 'accept: */*' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer AuthCode
  -d '{
    "label": "OpenWeatherMap Wetter Standort",
    "configuration": {
        "location": "'$gps'"
    },
    "UID": "openweathermap:weather-and-forecast:ow:weather_location",
    "thingTypeUID": "openweathermap:weather-and-forecast"
}'