Wie Number aus Shellscript für Color-Abfragen verwenden
-
- Beiträge: 15
- Registriert: 14. Feb 2020 23:12
Wie Number aus Shellscript für Color-Abfragen verwenden
Hallo,
mein Shellscript liefert einen Temperaturwert zurück.
Thing exec:command:TempCheckKS [command="python /etc/openhab2/scripts/tempSensoren.py Kuehlschrank", interval=20, timeout=20, autorun=false]
Kommt 19.8 zurück
In den Items müsste ja irgendwas wie folgt stehen:
String TempKuehlschrank "Temperatur Kühlschrank: [%s]" { channel="exec:command:TempCheckKS:output"}
An der Oberläche würde ich gerne "Temperatur Kühlschrank: 19.8 C" sehen und die 19.8 sollen rot sein, da der Wert > 14 C ist.
Was muss dann wie ein String oder Number oder Item sein oder doch ne rule? Mit den Beispielen aus der Hilfe werde ich nicht schlauf.
Bitte um Hilfe.
Danke.
mein Shellscript liefert einen Temperaturwert zurück.
Thing exec:command:TempCheckKS [command="python /etc/openhab2/scripts/tempSensoren.py Kuehlschrank", interval=20, timeout=20, autorun=false]
Kommt 19.8 zurück
In den Items müsste ja irgendwas wie folgt stehen:
String TempKuehlschrank "Temperatur Kühlschrank: [%s]" { channel="exec:command:TempCheckKS:output"}
An der Oberläche würde ich gerne "Temperatur Kühlschrank: 19.8 C" sehen und die 19.8 sollen rot sein, da der Wert > 14 C ist.
Was muss dann wie ein String oder Number oder Item sein oder doch ne rule? Mit den Beispielen aus der Hilfe werde ich nicht schlauf.
Bitte um Hilfe.
Danke.
-
- Beiträge: 121
- Registriert: 7. Jan 2020 19:36
Re: Wie Number aus Shellscript für Color-Abfragen verwenden
hi,
also ich würde meinen das es ein numer-item sein sollte, also in deinem fall dann so in etwa:
und in der sitemap kannst du das mit den farben realisieren:
also ich würde meinen das es ein numer-item sein sollte, also in deinem fall dann so in etwa:
Code: Alles auswählen
Number TempKuehlschrank "Temperatur Kühlschrank:[%.1f °C]" { channel="exec:command:TempCheckKS:output"}
Code: Alles auswählen
Default item=TempKuehlschrank labelcolor=[<=14="green", >14="red"] valuecolor=[<=14="green", >14="red"]
- udo1toni
- Beiträge: 15241
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Wie Number aus Shellscript für Color-Abfragen verwenden
Das Problem wird sein, dass exec nicht mit Number umgehen kann. Du musst in einer Rule die Umrechnung nach number vornehmen. Die Schriftfarbe kannst Du über das Text Widget als Parameter angeben, schau mal in die Doku.
Gesendet von meinem SM-G973F mit Tapatalk
Gesendet von meinem SM-G973F mit Tapatalk
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 15
- Registriert: 14. Feb 2020 23:12
Re: Wie Number aus Shellscript für Color-Abfragen verwenden
Danke
In der Hilfe wurde ich nichtfündig. Wie muss das item, die rule und die Sitemap für mein Beispiel aussehen??
In der Hilfe wurde ich nichtfündig. Wie muss das item, die rule und die Sitemap für mein Beispiel aussehen??
-
- Beiträge: 121
- Registriert: 7. Jan 2020 19:36
Re: Wie Number aus Shellscript für Color-Abfragen verwenden
nachdem udo1toni meint dass das mit dem number wohl nicht funktionieren wird dann probiers doch einfach mal mit dem string:
und
das wäre für mich der erste schritt um zu sehen ob auf der sitemap was angezeigt wird. wenn nicht mal das logfile beobachten was da steht.
rule anlegen, string in number umwandeln kannst du dann im zweiten schritt und brauchst du auch nur falls bei einer bestimmten temperatur irgend was passieren soll.
Code: Alles auswählen
String TempKuehlschrank "Temperatur Kühlschrank:[%s]" { channel="exec:command:TempCheckKS:output"}
Code: Alles auswählen
Default item=TempKuehlschrank labelcolor=[<=14="green", >14="red"] valuecolor=[<=14="green", >14="red"]
rule anlegen, string in number umwandeln kannst du dann im zweiten schritt und brauchst du auch nur falls bei einer bestimmten temperatur irgend was passieren soll.
-
- Beiträge: 15
- Registriert: 14. Feb 2020 23:12
Re: Wie Number aus Shellscript für Color-Abfragen verwenden
Das mit String und dann den String abfragen mit < oder > 14 funktioniert nicht. Schon alleine wegen der Nachkommastellen. String und Zahlen lassen sich nicht vergleichen. Schon probiert.
Darum wende ich mich ja ans Forum, ob und wie das jemand schon gemacht hat und wenn das als String vom Things zurückkommt, wie ich das dann in ne Number wandeln kann per rule und wie dann in der Sitemap bzw. Bei den Items noch was gemacht werden muss (zusätzlich mit Stringfeld oder...?)
In der Hilfe ist dazu weder ein brauchbares komplett durchgezogenes Beispiel noch wirklich viel Tipps&Tricks
Darum wende ich mich ja ans Forum, ob und wie das jemand schon gemacht hat und wenn das als String vom Things zurückkommt, wie ich das dann in ne Number wandeln kann per rule und wie dann in der Sitemap bzw. Bei den Items noch was gemacht werden muss (zusätzlich mit Stringfeld oder...?)
In der Hilfe ist dazu weder ein brauchbares komplett durchgezogenes Beispiel noch wirklich viel Tipps&Tricks
-
- Beiträge: 121
- Registriert: 7. Jan 2020 19:36
Re: Wie Number aus Shellscript für Color-Abfragen verwenden
natürlich, das stimmt, sorry. das einzige was mir dazu einfällt (habs aber nicht probiert...) dann ne regel in der art:
das "numberItem" musst du noch anlegen (und dann auch in der sitemap anzeigen lassen):
hoffe bei dem string wird kein "grad celsius" mit übergeben, sonst reicht das so noch nicht aus...
Code: Alles auswählen
rule "temperatur"
when
Item TempKuehlschrank received update
then
numberItem.postUpdate((TempKuehlschrank.state as Number).intValue)
end
Code: Alles auswählen
Number numberItem labelcolor=[<=14="green", >14="red"] valuecolor=[<=14="green", >14="red"]
- udo1toni
- Beiträge: 15241
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Wie Number aus Shellscript für Color-Abfragen verwenden
Naja, knapp daneben... 
Als erstes musst Du ein Proxy Item definieren (in diesem landet die Temperatur als Zahl), also z,B, so:
Dazu eine Rule, die die Umrechnung vornimmt:
Voraussetzung ist natürlich, dass der zurückgelieferte String wirklich nur den reinen Zahlenwert enthält und das Dezimaltrennzeichen ein Punkt ist. Sollte das nicht der Fall sein, muss die Rule das entsprechend berücksichtigen...
Nun, wo Du ein Number Item mit dem konkreten Zahlenwert (incl. Anzeige der Einheit...) hast, funktioniert das mit der Farbe auch, fast so, wie von bastler vorgeschlagen:
Hier https://www.openhab.org/docs/configurat ... lue-colors ist das mit den Farben gut erklärt.
Wie an der Definition des Widgets für die Sitemap gut zu erkennen, kannst Du die Farbe für Label und Value getrennt wählen (und mehr noch, Du könntest sogar die Farbe abhängig von einem anderen Item als dem, dessen Label und Status angezeigt werden auswählen...

Als erstes musst Du ein Proxy Item definieren (in diesem landet die Temperatur als Zahl), also z,B, so:
Code: Alles auswählen
Number nTempKuehlschrank "Kühlschrank [%f.1C°]" <temperature>
Code: Alles auswählen
rule "temperatur"
when
Item TempKuehlschrank changed
then
nTempKuehlschrank.postUpdate(Float::parseFloat(TempKuehlschrank.state))
end
Nun, wo Du ein Number Item mit dem konkreten Zahlenwert (incl. Anzeige der Einheit...) hast, funktioniert das mit der Farbe auch, fast so, wie von bastler vorgeschlagen:
Code: Alles auswählen
Text item=nTempKuehlschrank valuecolor=[<=14="green", >14="red"] labelcolor=[<=14="green", >14="red"]
Wie an der Definition des Widgets für die Sitemap gut zu erkennen, kannst Du die Farbe für Label und Value getrennt wählen (und mehr noch, Du könntest sogar die Farbe abhängig von einem anderen Item als dem, dessen Label und Status angezeigt werden auswählen...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 121
- Registriert: 7. Jan 2020 19:36
Re: Wie Number aus Shellscript für Color-Abfragen verwenden
vielen dank udo1toni für die korrektur
ich muß noch viel üben bis meine antworten halbwegs kompetent sind...
und würde gern eine frage zu deiner antwort stellen:
ich nutze bei mir ganz viel in einer rule die beim systemstart ausgeführt wird diese umrechnung für number-items:
im normalen betrieb kein problem, da hab ich immer reine integer-werte. aber wenn ich das system neu starte hab ich (wg influx persistence) immer ".0" hinten dran hängen. dadurch wird mir die sitemap nicht mehr richtig dargestellt weil das mapping das ".0" nicht zuordnen kann:
ist das so falsch? soll ich das besser auch auf dein "...Float::parseFloat(..." ändern? oder brauche ich das nur wenn ich dezimalzahlen haben möchte? (ich bekomme immerhin keine fehler im log und es funktioniert auch wie gewünscht)

und würde gern eine frage zu deiner antwort stellen:
ich nutze bei mir ganz viel in einer rule die beim systemstart ausgeführt wird diese umrechnung für number-items:
Code: Alles auswählen
iViHwr_PIr_Modus.postUpdate((iViHwr_PIr_Modus.state as Number).intValue)
Code: Alles auswählen
Switch item=iViHwr_PIr_Modus mappings=[0="aus", 2="auto", 1="Licht ein"]
- udo1toni
- Beiträge: 15241
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Wie Number aus Shellscript für Color-Abfragen verwenden
Nein, es kommt darauf an, welcher Ausgangswert zur Verfügung steht.
Wenn es darum geht, aus einer Zahl eine Zahl zu machen, passt die Formel (Wert).intValue für einen Integerwert oder (Wert).floatValue für einen Fließkommawert. Da Wert in diesem Fall ein Item.state ist, aber dieser Item.state eine Zahl enthält, reicht es, (Item.state as Number) zu schreiben. Die Typumwandlung nimmt openHAB eventuell sogar selbst vor, aber der Compiler kann ohne das Typecasting keine Funktion .intValue finden, weshalb das dann ohne das Typecasting fehlschlägt.
Anders sieht es bei Strings als Ausgangswert aus. Item.state ist in diesem Fall eben nicht 47.11, sondern "47.11". Für das menschliche Auge ist das identisch, der erste State wird aber als 32 Bit Float gespeichert (hexadezimal 0x423C70A4), der zweite State ist ein String, also hexadezimal 0x34372E3131.
Deshalb braucht es eine Funktion, um diesen String korrekt zu interpretieren. Da es sich um eine Fließkommazahl handelt, welche also eventuell (aber nicht zwingend) einen Punkt als Dezimaltrenner enhält, braucht man Java.Lang.Float als Bibliothek, und daraus die Funktion parseFloat (parse -> analysieren, zergliedern, bestimmen).
Wenn es um eine Ganzzahl geht, welche also keinen Dezimaltrenner enthält, greift man zu Int::parseInt(string).
Fun Fact: Der Float Wert 47.11 wird von openHAB als 47.1100006103515625 ausgegeben, wenn man die Anzahl der Dezimalstellen nicht begrenzt.
Wenn es darum geht, aus einer Zahl eine Zahl zu machen, passt die Formel (Wert).intValue für einen Integerwert oder (Wert).floatValue für einen Fließkommawert. Da Wert in diesem Fall ein Item.state ist, aber dieser Item.state eine Zahl enthält, reicht es, (Item.state as Number) zu schreiben. Die Typumwandlung nimmt openHAB eventuell sogar selbst vor, aber der Compiler kann ohne das Typecasting keine Funktion .intValue finden, weshalb das dann ohne das Typecasting fehlschlägt.
Anders sieht es bei Strings als Ausgangswert aus. Item.state ist in diesem Fall eben nicht 47.11, sondern "47.11". Für das menschliche Auge ist das identisch, der erste State wird aber als 32 Bit Float gespeichert (hexadezimal 0x423C70A4), der zweite State ist ein String, also hexadezimal 0x34372E3131.
Deshalb braucht es eine Funktion, um diesen String korrekt zu interpretieren. Da es sich um eine Fließkommazahl handelt, welche also eventuell (aber nicht zwingend) einen Punkt als Dezimaltrenner enhält, braucht man Java.Lang.Float als Bibliothek, und daraus die Funktion parseFloat (parse -> analysieren, zergliedern, bestimmen).
Wenn es um eine Ganzzahl geht, welche also keinen Dezimaltrenner enthält, greift man zu Int::parseInt(string).
Fun Fact: Der Float Wert 47.11 wird von openHAB als 47.1100006103515625 ausgegeben, wenn man die Anzahl der Dezimalstellen nicht begrenzt.

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet