Wie Number aus Shellscript für Color-Abfragen verwenden

GUI Relevanten, PaperUI, BasicUI, HabPanel ...

Moderatoren: seppy, udo1toni

steffenschmidt
Beiträge: 15
Registriert: 14. Feb 2020 23:12
Answers: 1

Wie Number aus Shellscript für Color-Abfragen verwenden

Beitrag 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.

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

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

Beitrag 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"]

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

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

Beitrag 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

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

steffenschmidt
Beiträge: 15
Registriert: 14. Feb 2020 23:12
Answers: 1

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

Beitrag von steffenschmidt »

Danke

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

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

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

Beitrag 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.

steffenschmidt
Beiträge: 15
Registriert: 14. Feb 2020 23:12
Answers: 1

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

Beitrag 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

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

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

Beitrag 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...

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

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

Beitrag 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...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

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

Beitrag 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)

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

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

Beitrag 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. ;)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten