Windgeschwindigkeit von KNX in OH

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
mex1254
Beiträge: 5
Registriert: 9. Dez 2020 12:47
Answers: 0

Windgeschwindigkeit von KNX in OH

Beitrag von mex1254 »

Hallo in die Runde,

ich habe bereits eine funktionierende KNX Steuerung und bin nun dabei das ganze in OpenHAB zu verwirklichen.
Ich habe bereits Jalousie auf/ab
Temperaturdaten auslesen und auch paar Charts die Temperaturdaten anzeigen. Gespeichert wird das ganze in einer MariaDB.
Ich stehe nun aber vor einem wahrscheinlich wirklich kleinen Problem aber ich komm nicht drauf.

Ich würde gerne den KNX Wert der Windgeschwindigkeit in kmh abbilden lassen.

das ganze sieht bei mir so aus

items:

Number Windgeschwindigkeit "Windgeschwindigkeit[JS(windspeed.js):%s km/h]" <wind> {channel="knx:device:bridge:generic:Windgeschwindigkeit"}

windspeed.js in scripts

(function(i){
return i*3.6;
})(input)

}

sitemap
Text label="Wetterdaten" icon="sun_clouds"
{
Text item=Windgeschwindigkeit icon="wind"
Chart item=Windgeschwindigkeit period=h service="mysql" legend=true refresh=300000
}

Ich benutzte das Item Windgeschwindigkeit auch für die Speicherung im Persistance File.

im Log sehe ich folgende Zeile:

org.eclipse.smarthome.core.transform.TransformationException: An error occurred while loading JavaScript. /volume1/@appstore/openHAB/conf/transform/windspeed.js (No such file or directory)

speichere ich nun das windspeed.js in den Pfad bekomme ich bei der ausgabe ein "NaN"

sonst liefert es mir den KNX Wert ohne Umrechnung.

Bitte um eure Hilfe bzw. Unterstützung. Danke schon mal

lg
von udo1toni » 11. Dez 2020 14:15
Das geht so nicht. Die einzige (vorgesehene) Möglichkeit, Daten über die Persistence zu speichern, ist, die Daten in ein Item zu speichern. Dein Problem ist, dass die Daten über knx rein kommen. knx bietet keinen Transformation Service beim Input. Das bedeutet, Du musst zwingend ein zweites Item anlegen und die Transformation über eine Rule vornehmen. So:

Code: Alles auswählen

rule "wind umrechnen"
when
    Item WindgeschwindigkeitIN received update // Eingang
then
    if(WindgeschwindigkeitIN.state instanceof Number)
        WindgeschwindigkeitOUT.postUpdate(transform("JS","windspeed.js",WindgeschwindigkeitIN.state.toString))
end
Dazu ist zu bemerken, dass die Prüfung auf einen gültigen Wert (ist eine Zahl) sehr wichtig ist, damit es nicht zu einer Exception kommt. Ob man dann den Transformation Service nutzt, oder gleich den Wert berechnet, ist bei dieser Berechnung keine Frage :)

Code: Alles auswählen

rule "wind umrechnen"
when
    Item WindgeschwindigkeitIN received update // Eingangswert
then
    if(WindgeschwindigkeitIN.state instanceof Number) // ist Eingangswert eine Zahl?
        WindgeschwindigkeitOUT.postUpdate((WindgeschwindigkeitIN.state as Number)*3.6) // Ausgangswert aus Eingangswert
end
Es gibt andere Addons, die das Einbinden im Link bzw. direkt im Channel erlauben, damit kann man sich dann die Rule komplett sparen.

Es gibt noch eine weitere Option, die leider bisher nicht gut dokumentiert ist, das ist das Erstellen eine Profiles. Als Beispiel nenne ich hier das Offset Profile, welches man nutzen könnte, um einem Wert einen Offset hinzuzurechnen, also z.B. bekomst Du die Temperatur in Kelvin angeliefert, möchtest aber °Celsius haben, dann setzt Du für das Item das Profile [profile="offset", offset="-273.15"] und schon wird statt 300 der Wert 26.85 ins Item gespeichert. Und das funktioniert ganz ohne Rule!
Leider wird (bisher) kein Profile "factor" mitgeliefert, es sollte aber kein Problem sein, das selbst anzulegen, wenn man mal herausgefunden hat, wie man ein eigenes Profile entwickelt. Bis dahin ist aber die oben gezeigte Rule und ein zweites Item die einzige sinnvolle Möglichkeit, die bereits transformierten Werte zu persistieren.
Gehe zur vollständigen Antwort

ibot1989
Beiträge: 99
Registriert: 30. Jul 2016 19:51
Answers: 0
Wohnort: östlich von Hamburg, südlich von Lübeck, nördlich von Geesthacht

Re: Windgeschwindigkeit von KNX in OH

Beitrag von ibot1989 »

Ist da nicht ein "}" zu viel in deinem .js File?

Gruß iBot

Gesendet von meinem ONEPLUS A6013 mit Tapatalk



mex1254
Beiträge: 5
Registriert: 9. Dez 2020 12:47
Answers: 0

Re: Windgeschwindigkeit von KNX in OH

Beitrag von mex1254 »

Danke für die Rückmeldung. Da hatte ich einen Kopierfehler.

so sieht die aus:

(function(i){
return i*3.6;
})(input)

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Windgeschwindigkeit von KNX in OH

Beitrag von udo1toni »

windspeed.js gehört in das Verzeichnis transform/ und nicht in scripts/ :) JS ist ein Transformation Service... ;)
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

mex1254
Beiträge: 5
Registriert: 9. Dez 2020 12:47
Answers: 0

Re: Windgeschwindigkeit von KNX in OH

Beitrag von mex1254 »

Danke udo,

das war es :D .
Gestern leider kein wind darum konnte ich es nicht wirklich testen. Aber heute sieht es gut aus und es schreibt auch die richtigen Werte.
Ich hätte jetzt noch eine weitere Frage:

unter meiner gerechneten Windgeschwindigkeit, habe ich ein Chart auf dem die Windgeschwindigkeit von KNX angezeigt wird. Aber natürlich auch wieder in m/s weil dort das Item Windgeschwindigkeit gespeichert und verwendet wird und nicht der Wert nach dem umrechnen mit der windspeed.js

wie wäre hier der richtige Weg um die Werte ins jdbc.persist file zu bekommen. Das ganze sieht zur zeit so aus:

Strategies {
everyMinute : "0 * * * * ?"
everyHour : "0 0 * * * ?"
everyDay : "0 0 0 * * ?"
default = everyChange
}

Items {
Temperatur_Aussen : strategy = everyChange, restoreOnStartup
Windgeschwindigkeit : strategy = everyChange, restoreOnStartup <-- kann ich hier irgendwie die windspeed.js hinterlegen? bzw. den Wert der dort berechnet wird?
//Regen : strategy = everyChange, restoreOnStartup

Hier ein Screenshot um sich das vorzustellen:
wind.jpg

vielen dank

grüße mex
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Windgeschwindigkeit von KNX in OH

Beitrag von udo1toni »

Das geht so nicht. Die einzige (vorgesehene) Möglichkeit, Daten über die Persistence zu speichern, ist, die Daten in ein Item zu speichern. Dein Problem ist, dass die Daten über knx rein kommen. knx bietet keinen Transformation Service beim Input. Das bedeutet, Du musst zwingend ein zweites Item anlegen und die Transformation über eine Rule vornehmen. So:

Code: Alles auswählen

rule "wind umrechnen"
when
    Item WindgeschwindigkeitIN received update // Eingang
then
    if(WindgeschwindigkeitIN.state instanceof Number)
        WindgeschwindigkeitOUT.postUpdate(transform("JS","windspeed.js",WindgeschwindigkeitIN.state.toString))
end
Dazu ist zu bemerken, dass die Prüfung auf einen gültigen Wert (ist eine Zahl) sehr wichtig ist, damit es nicht zu einer Exception kommt. Ob man dann den Transformation Service nutzt, oder gleich den Wert berechnet, ist bei dieser Berechnung keine Frage :)

Code: Alles auswählen

rule "wind umrechnen"
when
    Item WindgeschwindigkeitIN received update // Eingangswert
then
    if(WindgeschwindigkeitIN.state instanceof Number) // ist Eingangswert eine Zahl?
        WindgeschwindigkeitOUT.postUpdate((WindgeschwindigkeitIN.state as Number)*3.6) // Ausgangswert aus Eingangswert
end
Es gibt andere Addons, die das Einbinden im Link bzw. direkt im Channel erlauben, damit kann man sich dann die Rule komplett sparen.

Es gibt noch eine weitere Option, die leider bisher nicht gut dokumentiert ist, das ist das Erstellen eine Profiles. Als Beispiel nenne ich hier das Offset Profile, welches man nutzen könnte, um einem Wert einen Offset hinzuzurechnen, also z.B. bekomst Du die Temperatur in Kelvin angeliefert, möchtest aber °Celsius haben, dann setzt Du für das Item das Profile [profile="offset", offset="-273.15"] und schon wird statt 300 der Wert 26.85 ins Item gespeichert. Und das funktioniert ganz ohne Rule!
Leider wird (bisher) kein Profile "factor" mitgeliefert, es sollte aber kein Problem sein, das selbst anzulegen, wenn man mal herausgefunden hat, wie man ein eigenes Profile entwickelt. Bis dahin ist aber die oben gezeigte Rule und ein zweites Item die einzige sinnvolle Möglichkeit, die bereits transformierten Werte zu persistieren.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

mex1254
Beiträge: 5
Registriert: 9. Dez 2020 12:47
Answers: 0

Re: Windgeschwindigkeit von KNX in OH

Beitrag von mex1254 »

Wahnsinn - vielen dank. Das ist genau das was ich benötigt habe und funktioniert auf anhieb.
So macht das ganze wirklich Freude. Ich denke ich werde hier eventuell noch die eine oder andere Frage stellen.
Nochmals vielen dank udo1toni - ich bin begeistert

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Windgeschwindigkeit von KNX in OH

Beitrag von udo1toni »

Immer gerne :)


Gesendet von iPad mit Tapatalk
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

mex1254
Beiträge: 5
Registriert: 9. Dez 2020 12:47
Answers: 0

Re: Windgeschwindigkeit von KNX in OH

Beitrag von mex1254 »

Hallo nochmal,


ich hab jetzt ein weniger herumprobiert und wollte fragen ob es eine Möglichkeit gibt den Zeitstempel in die Ausgabe mitzunehmen.

meine rule sieht jetzt so aus:

rule "Update Aussen max and min temperatures"
when
Item Temperatur_Aussen changed or
Time cron "0 0 0 * * ?" or
System started
then
postUpdate(Temperatur_AussenMax24h, Temperatur_Aussen.maximumSince(now.withTimeAtStartOfDay).state).
postUpdate(Temperatur_AussenMin24h, Temperatur_Aussen.minimumSince(now.withTimeAtStartOfDay).state)
postUpdate(Temperatur_AussenMax1w, Temperatur_Aussen.maximumSince(now.minusWeeks(1)).state)
postUpdate(Temperatur_AussenMin1w, Temperatur_Aussen.minimumSince(now.minusWeeks(1)).state)
postUpdate(Temperatur_AussenMax1m, Temperatur_Aussen.maximumSince(now.withTimeAtStartOfDay.withDayOfMonth(1)).state)
postUpdate(Temperatur_AussenMin1m, Temperatur_Aussen.minimumSince(now.withTimeAtStartOfDay.withDayOfMonth(1)).state)

sitemap

Text item=Temperatur_AussenMax24h icon="sun"
Text item=Temperatur_AussenMin24h icon="snow"
Text item=Temperatur_AussenMax1w icon="sun"
Text item=Temperatur_AussenMin1w icon="snow"
Text item=Temperatur_AussenMax1m icon="sun"
Text item=Temperatur_AussenMin1m icon="snow"

das ganze funktioniert auch aber ich komm nicht drauf wie ich in der Ausgabe den Timestamp reinbekomme. In der DB sehe ich den Zeitstempel ja.



mfg

mex
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Windgeschwindigkeit von KNX in OH

Beitrag von udo1toni »

Es gibt dazu zwei Möglichkeiten. Das eine wäre ein eigenes Item für den Zeitstempel (böte sich an, wenn Dir ein Zeitstempel für alle Items reicht), das zweite wäre, statt Number Items String Items zu verwenden und dann den Zeitstempel gemeinsam mit dem Wert im String speichern. Wie es besser ist, musst Du selbst entscheiden :)


Gesendet von iPad mit Tapatalk
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten