[gelöst] devStateIcon mit Bedingungen im cmd-Teil

Begonnen von zife, 27 September 2022, 14:39:22

Vorheriges Thema - Nächstes Thema

zife

Hallo fhem'ler,

ich schwirre um die Lösung herum, doch es fehlt noch der letzte Impuls.

Ich habe Rolläden in FHEMWEB und im Floorplan mit einem Icon dargestellt, das je nach Position anders aussieht. Soweit nichts Besonderes. Dafür habe ich das Attribut "webCmd" mit "position" belegt, und so kann ich auch per Schieberegler direkt eine Position anfahren.

Funktioniert soweit.

Nun möchte ich gerne zusätzlich, dass der Klick auf das Icon den Rolladen öffnet/schließt (abhängig von der Position) - oder, wenn er gerade fährt, den Rolladen stoppt. Also 2 unterschiedliche Kommandos, abhängig vom Fahrzustand.

Da ich aber für die o.g. Anzeige "webCmd" auf "position" gestellt hab, weiß ich nicht, wie ich nun im "devStateIcon" die Bedingungsprüfung unterbringen soll.

So sieht mein devStateIcon derzeit aus:
0:czRoll_100@black:down 100:czRoll_100@yellow:up 1\d.*:czRoll_10@yellow:up 2\d.*:czRoll_20@yellow:up 3\d.*:czRoll_30@yellow:up 4\d.*:czRoll_40@yellow:up 5\d.*:czRoll_50@yellow:up 6\d.*:czRoll_60@yellow:up 7\d.*:czRoll_70@yellow:up 8\d.*:czRoll_80@yellow:up 9\d.*:czRoll_90@yellow:up \d.*:czRoll_10@yellow:down

Das bewirkt schon mal, dass ein Klick aufs Icon den Rolladen hochfährt (sofern nicht oben), bzw. runterfährt (wenn schon oben). Aber so kann ich ihn eben nicht anhalten.

Die Logik STATE:icon:cmd ist mir klar, doch hier müsste ich ja bei cmd die Bedingung einfügen, die zwischen Bewegung (state=closes) und Stillstand (state<>closes) unterscheidet. Und da hänge ich fest.

Kann mir jemand bitte auf die Sprünge helfen, sofern überhaupt möglich ist, was ich hier versuche?


   
fhem mit EnOcean, Gardena, Vorwerk, Miele und Teufel/Raumfeld-Integration... nur meine Kinder wollen sich damit nicht anständig steuern lassen. Wer weiß Rat?

Beta-User

Selbstredend sollte es auch gehen, das "hinten" zu reparieren, etwa mit Hilfe eines cmdalias...

Hier würde ich aber eher vorne anfangen und halt in dem Fall, dass der Rollladen grade läuft, was anderes via stateFormat in STATE schreiben lassen als üblich, und dann darüber eben eine andere Icon/cmd-Kombi anzeigen lassen... (also stateFormat in der Perl-Variante mit if).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

zife

...ach, stimmt, wiedermal zu eng gedacht  ;) 
Danke für den Ansatz!

Okay, dann würde ich im ersten Schritt mit meinen rudimentären Kenntnissen sowas hinbiegen als "stateFormat":

{if(ReadingsVal("Arbeitszimmer_Rolladen","state",0) eq "fährt runter") {return "down";} elsif (ReadingsVal("Arbeitszimmer_Rolladen","state",0) eq "up") {return "fährt hoch";} else {return "Position";} }

Klar, "Position" ist erstmal ein Platzhalter... wie bekomme ich die Position (liegt als Reading "position" im Device) als Variable in den "return"-Teil? Ich möchte ja, dass bei Stillstand die aktuelle Position im state steht.
fhem mit EnOcean, Gardena, Vorwerk, Miele und Teufel/Raumfeld-Integration... nur meine Kinder wollen sich damit nicht anständig steuern lassen. Wer weiß Rat?

Beta-User

Also mal abgesehen davon, dass man nach der expliziten "return"-Anwisung das else gar nicht braucht, das semantisch etwas wild durcheinandergeht und ich für diesen Fall immer "ein-Wort"-STATE schreiben würde:
Zitat von: zife am 27 September 2022, 15:56:01
wie bekomme ich die Position (liegt als Reading "position" im Device) als Variable in den "return"-Teil? Ich möchte ja, dass bei Stillstand die aktuelle Position im state steht.
..."vielleicht" mit ReadingsVal()...?!?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

zife

Zitat von: Beta-User am 27 September 2022, 16:01:33
Also mal abgesehen davon, dass man nach der expliziten "return"-Anwisung das else gar nicht braucht, das semantisch etwas wild durcheinandergeht und ich für diesen Fall immer "ein-Wort"-STATE schreiben würde:...
Ja, shame on me, man lernt mit seinen Aufgaben  8)

Zitat von: Beta-User am 27 September 2022, 16:01:33
"vielleicht" mit ReadingsVal()...?!?

Da hab ich die Syntax nicht zusammengebracht - bekomme immer Syntax Error, und ein Beispiel hab ich in der Commandref und in der Forumssuche nicht auftreiben können. Vermutlich bring ich die Klammersetzung nicht richtig zusammen - wie muss der ReadingsVal-Aufruf innerhalb des return-Teils aussehen?
fhem mit EnOcean, Gardena, Vorwerk, Miele und Teufel/Raumfeld-Integration... nur meine Kinder wollen sich damit nicht anständig steuern lassen. Wer weiß Rat?

Beta-User

Vermutlich willst du sowas:
{ my $st = ReadingsVal($name,'state',0); return $st if $st eq 'down' || $st eq 'up'; return ReadingsVal($name,'position',0); }
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

zife

Ja grandios!

Mensch, wieder was gelernt... und ganz neue Möglichkeiten eröffnen sich.

Danke!!
fhem mit EnOcean, Gardena, Vorwerk, Miele und Teufel/Raumfeld-Integration... nur meine Kinder wollen sich damit nicht anständig steuern lassen. Wer weiß Rat?

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors