Seite 1 von 2

Wie Number aus Shellscript für Color-Abfragen verwenden

Verfasst: 24. Feb 2020 19:42
von steffenschmidt
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.

Re: Wie Number aus Shellscript für Color-Abfragen verwenden

Verfasst: 24. Feb 2020 20:00
von bastler
hi,

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"}
und in der sitemap kannst du das mit den farben realisieren:

Code: Alles auswählen

Default item=TempKuehlschrank labelcolor=[<=14="green", >14="red"]  valuecolor=[<=14="green", >14="red"]

Re: Wie Number aus Shellscript für Color-Abfragen verwenden

Verfasst: 24. Feb 2020 22:58
von udo1toni
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


Re: Wie Number aus Shellscript für Color-Abfragen verwenden

Verfasst: 25. Feb 2020 14:32
von steffenschmidt
Danke

In der Hilfe wurde ich nichtfündig. Wie muss das item, die rule und die Sitemap für mein Beispiel aussehen??

Re: Wie Number aus Shellscript für Color-Abfragen verwenden

Verfasst: 25. Feb 2020 19:24
von bastler
nachdem udo1toni meint dass das mit dem number wohl nicht funktionieren wird dann probiers doch einfach mal mit dem string:

Code: Alles auswählen

String TempKuehlschrank "Temperatur Kühlschrank:[%s]" { channel="exec:command:TempCheckKS:output"}
und

Code: Alles auswählen

Default item=TempKuehlschrank labelcolor=[<=14="green", >14="red"]  valuecolor=[<=14="green", >14="red"]
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.

Re: Wie Number aus Shellscript für Color-Abfragen verwenden

Verfasst: 25. Feb 2020 19:56
von steffenschmidt
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

Re: Wie Number aus Shellscript für Color-Abfragen verwenden

Verfasst: 25. Feb 2020 20:53
von bastler
natürlich, das stimmt, sorry. das einzige was mir dazu einfällt (habs aber nicht probiert...) dann ne regel in der art:

Code: Alles auswählen

rule "temperatur"
    when
        Item TempKuehlschrank received update
    then
        numberItem.postUpdate((TempKuehlschrank.state as Number).intValue)
    end
das "numberItem" musst du noch anlegen (und dann auch in der sitemap anzeigen lassen):

Code: Alles auswählen

Number numberItem labelcolor=[<=14="green", >14="red"]  valuecolor=[<=14="green", >14="red"]
hoffe bei dem string wird kein "grad celsius" mit übergeben, sonst reicht das so noch nicht aus...

Re: Wie Number aus Shellscript für Color-Abfragen verwenden

Verfasst: 25. Feb 2020 22:09
von udo1toni
Naja, knapp daneben... :)
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> 
Dazu eine Rule, die die Umrechnung vornimmt:

Code: Alles auswählen

rule "temperatur"
when
    Item TempKuehlschrank changed
then
    nTempKuehlschrank.postUpdate(Float::parseFloat(TempKuehlschrank.state))
end
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:

Code: Alles auswählen

Text item=nTempKuehlschrank valuecolor=[<=14="green", >14="red"] labelcolor=[<=14="green", >14="red"]
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...

Re: Wie Number aus Shellscript für Color-Abfragen verwenden

Verfasst: 26. Feb 2020 07:38
von bastler
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:

Code: Alles auswählen

iViHwr_PIr_Modus.postUpdate((iViHwr_PIr_Modus.state as Number).intValue)
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:

Code: Alles auswählen

Switch item=iViHwr_PIr_Modus mappings=[0="aus", 2="auto", 1="Licht ein"]
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)

Re: Wie Number aus Shellscript für Color-Abfragen verwenden

Verfasst: 26. Feb 2020 09:17
von udo1toni
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. ;)