Nervige kommastellen ändern

GUI Relevanten, PaperUI, BasicUI, HabPanel ...

Moderatoren: seppy, udo1toni

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

Re: Nervige kommastellen ändern

Beitrag von udo1toni »

Das Problem ist, dass Du auf dem selben Channel empfangen und senden willst. Das wird mit dem JS so nicht funktionieren. Du musst ja den Wert auch in der anderen Richtung konvertieren und dann mit 10 multiplizieren.

Wahrscheinlich ist es das einfachste, Du nutzt ein Proxy Item mit Rule. Sieht so aus:

Code: Alles auswählen

//Items: ThermostatKueche_TempSet, ThermostatKueche_TempSet_proxy

rule "get temp"
when
    Item ThermostatKueche_TempSet changed
then
    if(!(newState instanceof Number))
        return;
    ThermostatKueche_TempSet_proxy.postUpdate((newState as Number)/10)
end

rule "set temp"
when
    Item ThermostatKueche_TempSet_proxy received command
then
    if(!(receivedCommand instanceof Number))
        return;
    ThermostatKueche_TempSet.sendCommand((receivedCommand as Number) * 10)
end
In der UI bindest Du nur das Item ThermostatKueche_TempSet_proxy ein.
Für die Ist-Temperatur funktioniert es natürlich mit dem JS.

Wenn Du mehrere gleichartige Devices hast, kannst Du für die read only Channel immer das selbe JS Script angeben. Für die read/write Channel müssen die beiden Rules etwas angepasst werden, damit sie mit Gruppen arbeiten. Die Itemnamen müssen in zwei Gruppen gepackt werden und die Namen der Items müssen voneinander ableitbar sein (wie im Beispiel, das eine Item hat nur das _proxy hinten dran hängen). Z.B. so:

Code: Alles auswählen

//Items: ThermostatKueche_TempSet, ThermostatKueche_TempSet_proxy

rule "get temp"
when
    Member of gThermostat_TempSet changed
then
    if(!(newState instanceof Number))
        return;
    val myItem = gThermostat_TempSet_proxy.members.filter[i|i.name.startsWith(triggeringItem.name)].head
    myItem.postUpdate((newState as Number)/10)
end

rule "set temp"
when
    Member of gThermostat_TempSet_proxy received command
then
    if(!(receivedCommand instanceof Number))
        return;
    val strName = triggeringItem.name.substring(0,triggeringItem.name.length - 6)
    val myItem = gThermostat_TempSet.members.filter[i|i.name == strName].head
    myItem.sendCommand((receivedCommand as Number) * 10)
end
Ungetestet. Die Namensberechnung funktioniert natürlich einfacher, wenn man ein Zeichen exklusiv im Itemnamen verwenden kann (das wäre der Unterstrich...), dann könnte man mit triggeringItem.name.split("_").get(0) einfach den Teil vor dem Unterstrich extrahieren, so muss der angehängte Teilstring halt abgeschnitten werden.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28

Re: Nervige kommastellen ändern

Beitrag von zinnik »

Hallo Udo

du bist ein Schatz also die erste Variante funktioniert schon.

Mit den Gruppen das habe ich noch nicht ganz so richtig verstanden.

Ich habe in meinem SemanticModel zwar auch Gruppen aber nicht direkt nach Eigenschaften wie zb: Licht, Temperaturen, Schalter


Könntest du mir noch zeigen wie so ein Gruppenname aussehen muss damit dies "triggeringItem.name.split("_").get(0)" funktioniert und wenn möglich die rules dazu.

Das Gruppenitem TempSet, wird unter "Direct Parent Groups" auch was ausgefüllt oder bleibt das leer?
Screenshot (210).png
PS:die rules tempset und tempget sind einzelne rules oder die kommen nicht in einen code?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openhab 4.1.0.M Docker (Qnap)
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.

Lg zinnik

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

Re: Nervige kommastellen ändern

Beitrag von udo1toni »

zinnik hat geschrieben: 22. Okt 2022 11:31 PS:die rules tempset und tempget sind einzelne rules oder die kommen nicht in einen code?
Ich schreibe die Rules grundsätzlich als DSL Text Rule auf. Dabei können mehrere Rules in einer Textdatei abgespeichert werden. Die einzelne Rule beginnt mit dem Schlüsselwort rule, dann folgt der when-Block, in dem alle Trigger gelistet sind, danach folgt der then-Block, der den auszuführenden Code beinhaltet. Die Rule endet mit dem Schlüsselwort end.

Der Teil zwischen when und then wird in der UI über das when definiert. Der Teil zwischen then und end kann als DSL Rule Code im then hinterlegt werden.
Da die beiden Rules unterschiedliche Trigger haben, muss der Code auch in zwei getrennten Rules angelegt werden.
zinnik hat geschrieben: 22. Okt 2022 11:31 Könntest du mir noch zeigen wie so ein Gruppenname aussehen muss damit dies "triggeringItem.name.split("_").get(0)" funktioniert und wenn möglich die rules dazu.
Aber gerne doch.
Itemanmen:

Code: Alles auswählen

ThermostatKuecheTempSet_echt
ThermostatKuecheTempSet_proxy
ThermostatWohnzimmerTempSet_echt
ThermostatWohnzimmerTempSet_proxy
Hurslibarsli_echtJetzt
Hurslibarsli_proxyDann
// alle Items mit *_echt* in die Gruppe gThermostatTempSetEcht
// alle Items mit *_proxy* in die Gruppe gThermostatTempSetProxy

Code: Alles auswählen

rule "get temp"
when
    Member of gThermostatTempSetEcht changed
then
    if(!(newState instanceof Number))
        return;
    val myItem = gThermostatTempSetProxy.members.filter[i|i.name.startsWith(triggeringItem.name.split("_").get(0))].head
    myItem.postUpdate((newState as Number)/10)
end

rule "set temp"
when
    Member of gThermostatTempSetProxy received command
then
    if(!(receivedCommand instanceof Number))
        return;
    val myItem = gThermostatTempSetEcht.members.filter[i|i.name.startsWith(triggeringItem.name.split("_").get(0))].head
    myItem.sendCommand((receivedCommand as Number) * 10)
end
Welche Schlüsselworte Du verwendest, ist egal, letztlich können sie sogar unterschiedlich sein (siehe Hurslibarsli Beispiel). Es muss nur sichergestellt sein, dass die Items in der korrekten Gruppe sind (das hat NICHTS mit dem Semantic Model zu tun, Items können beliebig vielen Gruppen zugeordnet werden) und dass der Namensteil vor dem Unterstrich zum einen eindeutig innerhalb der Gruppe und zum anderen identisch mit exakt einem Gegenstück in der anderen Gruppe ist. Das heißt, Du kannst ohne weiteres noch weitere Items mit dem Namensteil ThermostatKuecheTempSet anlegen, jedoch dürfen diese nicht den Gruppen zugeordnet sein (Da TempSet schon eine eindeutige Zuordnung zur Funktion ist, ist die Gefahr hier vermutlich gering)

Es bietet sich an, jeweils identische Endungen zu verwenden. Auch die Gruppennamen sind beliebig, aber es scheint naheliegend, hier einen Zusammenhang herzustellen, um die Übersicht zu bewahren.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28

Re: Nervige kommastellen ändern

Beitrag von zinnik »

ok prima ich probier mein Glück, danke :lol:

Du sag mal: Woher weisst du das es noch ein ThermostatWohnzimmerTempSet gibt?
Oder war das reiner Zufall?

Momentan existieren nämlich nur diese beiden bei mir ;)
openhab 4.1.0.M Docker (Qnap)
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.

Lg zinnik

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

Re: Nervige kommastellen ändern

Beitrag von udo1toni »

Tja...

:lol:

Tatsächlich Zufall, wobei ehrlicherweise Wohnzimmer einer der Topp Räume für Komfortsteuerungen ist, also keine besondere Herausforderung, den als Kandidaten zu erraten.
Hurslibarsli hast Du aber nicht als Zimmer, da bin ich ziemlich sicher...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28

Re: Nervige kommastellen ändern

Beitrag von zinnik »

Im Neuen Openhab gibt es ja nicht mehr direkt das profil JS.

Ausser man installiert das Java Scriptaddon, ich weiss aber auch nicht genau wie ich jetzt die Funktion thermostas.js bei einem item einsetzen soll.

Kann da nochmal jemand helfen?

Danke Lg sven
zinnik hat geschrieben: 21. Okt 2022 12:55 Hallo

Also ich habe jetzt nochmal einiges Probiert um das Thermostat ordentlich zu steuern.

Aber bekomme keine vernünftige Lösung hin. Die Frage ist halt, ich möchte mir mehrere für ganze haus anschaffen aber vor her sollte das ordentlich laufen.

Der Stand ist jetzt so:
Thermostat Ketotek 0155B 3A für Fussbodenheizung.
Thermostat lässt sich über Smartlife App oder Tuya wunderbar steuern.
In Openhab mit Tuya Bindung über Lokale IP eingebunden.... IP ist fest vergeben über Fritzbox.
Thermostat ist unter Tuya Cloud Project registriert um an Device ID, Local ID und Product ID zu kommen.
In openhab liefert das Thermostat unter dem Channel Tempset werte von 210 anstatt 21 °C und
Tempcurrent genauso.

der Channel sieht so aus: Wo bei mir nicht ganz klar ist was die zahlen bedeuten.

Code: Alles auswählen

id: TempSet
    channelTypeUID: tuya:number
    label: TempSet
    description: null
    configuration:
      dp: 2
      max: 700
      min: 5
Das Item schaut so aus:
Screenshot (209).png

Das Profil ist als JS Transformation mit die Function eingetragen: Damit ich die zb.: 210 auf 21 bekomme.

Code: Alles auswählen

(function(i) {
return (i/10);
})(input)
Soweit funktioniert alles, wenn ich nun aber in der Sitemap ein "Setpoint Widget" setze, zb. so :

Code: Alles auswählen

Setpoint icon="temperature" label="Temp setzen" item=ThermostatKueche_TempSet minValue=5 maxValue=35 step=0.5
Und ich will auf 21.5 setzen dann springt die Anzeige kurz auf 21.5 und in weniger als eine Sekunde auf 5 und das passiert auch in der Smartlife App.

Im openhab log erhalte ich folgendes:

Code: Alles auswählen

2022-10-21 12:50:21.081 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'ThermostatKueche_TempSet' received command 21.5
2022-10-21 12:50:21.083 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'ThermostatKueche_TempSet' predicted to become 21.5
2022-10-21 12:50:21.086 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'ThermostatKueche_TempSet' changed from 21.0 to 21.5
2022-10-21 12:50:21.195 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'ThermostatKueche_TempSet' changed from 21.5 to 5.0

In der Smartlife App springt er dann auch auf 5°C.

Ich weiss nicht was ich noch machen kann.

Mache ich das allerdings ohne die JS Function dann funktioniert die Steuerung aber dann zeigt er mir immer 210 anstatt 21 an.

In der Sitemap könnte man die Ansicht vielleicht noch verändern aber im habpanel als Widget wird wieder 210 angezeigt.

Ich brauche dringend euere Hilfe!!!!
openhab 4.1.0.M Docker (Qnap)
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.

Lg zinnik

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

Re: Nervige kommastellen ändern

Beitrag von udo1toni »

zinnik hat geschrieben: 30. Aug 2023 20:08 Im Neuen Openhab gibt es ja nicht mehr direkt das profil JS.
das gab es auch im "alten" openHAB nicht "direkt". Unter OH1 bis OH3 musste man JS Transformation Service installieren, unter OH4 muss man die JavaScript Scripting Engine installieren, weil die den Job mit übernimmt, so schwer ist das aber nicht...

Du kannst natürlich statt des JavaScript Scripts nun auch DSL Code verwenden (das ist der Punkt der Änderung, man kann nun Transformations mit jeder installierten Script Engine erledigen, vorausgesetzt, man weiß, wie der Code aufgebaut sein muss...)

Der Aufruf ist gegenüber den älteren openHAB Versionen unverändert, je nachdem wo Du die Transformation unterbringen willst schreibst Du das genauso hin, wie auch schon unter openHAB3.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten