Seite 1 von 1

Windgeschwindigkeit von KNX in OH

Verfasst: 9. Dez 2020 14:50
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

Re: Windgeschwindigkeit von KNX in OH

Verfasst: 9. Dez 2020 15:22
von ibot1989
Ist da nicht ein "}" zu viel in deinem .js File?

Gruß iBot

Gesendet von meinem ONEPLUS A6013 mit Tapatalk



Re: Windgeschwindigkeit von KNX in OH

Verfasst: 9. Dez 2020 15:31
von mex1254
Danke für die Rückmeldung. Da hatte ich einen Kopierfehler.

so sieht die aus:

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

Re: Windgeschwindigkeit von KNX in OH

Verfasst: 9. Dez 2020 19:43
von udo1toni
windspeed.js gehört in das Verzeichnis transform/ und nicht in scripts/ :) JS ist ein Transformation Service... ;)

Re: Windgeschwindigkeit von KNX in OH

Verfasst: 11. Dez 2020 07:27
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

Re: Windgeschwindigkeit von KNX in OH

Verfasst: 11. Dez 2020 14:15
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.

Re: Windgeschwindigkeit von KNX in OH

Verfasst: 14. Dez 2020 11:20
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

Re: Windgeschwindigkeit von KNX in OH

Verfasst: 15. Dez 2020 11:46
von udo1toni
Immer gerne :)


Gesendet von iPad mit Tapatalk

Re: Windgeschwindigkeit von KNX in OH

Verfasst: 15. Dez 2020 11:50
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

Re: Windgeschwindigkeit von KNX in OH

Verfasst: 15. Dez 2020 13:20
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