Befehle auf Weboberfläche

Begonnen von Superposchi, 06 März 2023, 10:50:24

Vorheriges Thema - Nächstes Thema

Superposchi

Hallo, hab da mal ne etwas blöde Frage.
Ich möchte gerne für einige Devices in der Weboberfläche einen extra Befehl hinterlegen.
Mit fertigen Einstellungen geht das ja via webcmd, aber ginge sowas zb auch mit einem frei definierbaren setreading?
Würde mir gerne eine Art Reset erstellen, der bestimmte Readings auf Standardwerte zurücksetzt.

Aurel_B

#1
Ja, das geht via EventMap, hier ein Beispiel:

defmod Regelung_Raumtemp DOIF {\
if ([$SELF:reset_Raumtemp] eq 'true') {\
# Irgendwelcher Code
set_Reading('reset_Raumtemp', 'false');;\
}
}
attr Regelung_Raumtemp eventMap /reset_Raumtemp true:reset_Raumtemp/foo 1:bar/
attr Regelung_Raumtemp readingList reset_Raumtemp foo
attr Regelung_Raumtemp setList reset_Raumtemp # Bin ich nicht sicher, ob es das überhaupt braucht!
attr Regelung_Raumtemp webCmd enable:disable:reset_Raumtemp:bar


Ist jetzt für ein DOIF, sollte denke ich aber grundsätzlich für alle Devices gehen?

Ich habe 2 eigene webCmds definiert, reset_Raumtemp und bar. Beide brauchen noch ein entsprechend setzbare Readings, darum kümmert sich readingList. Ich habe bewusst für den Cmd bar das Reading foo verwendet um zu zeigen, das Cmd und Readingname nicht gleich sein müssen. Die Magie passiert nun via eventMap: dort gibst du an, was genau für ein Reading du mit deinem Cmd setzen möchtest, also der Cmd bar setzt das Reading foo auf 1.
reset_Raumtemp wird noch im DOIF Block ausgewertet, so kannst du auch komplexere Vorgänge steuern.

Ich hoffe, es ist alles klar. Ist eine coole Möglichkeit und unkompliziert Befehle auszuführen, ich nutze die sehr oft! So hast du auch ohne zusätzliche UI eine kleine Steuerzentrale, siehe Anhang.

DeeSPe

Zitat von: ansgru am 06 März 2023, 14:41:54
Ist jetzt für ein DOIF, sollte denke ich aber grundsätzlich für alle Devices gehen?

eventMap gibt es für jedes Device, allerdings readingList nicht.

Ich würde als Lösungsvorschlag cmdalias einbringen.
Damit kann man sich jeden beliebigen Befehl bauen und dann per webCmd auf der Oberfläche verfügbar machen.

z.B.
define d dummy
attr d webCmd mySet

define ca_d_mySet cmdalias set d mySet AS setreading d myTestReading TEST


Beim Aufruf von "set d mySet" wird das Reading 'myTestReading' mit dem Wert 'TEST' geschrieben.
Es kann an dieser Stelle auch beliebiger Perl-Code ausgeführt werden, z.B. (selbes Ergebnis wie oben, nur als Perl):
define ca_d_mySet cmdalias set d mySet AS {fhem 'setreading d myTestReading TEST'}

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Aurel_B

Sehr cool, kannte ich noch gar nicht! Die Funktionsweise erschloss sich bei mir erst nach einigem Grübeln:

Ich überschreibe quasi mit cmdalias den Befehl "set d mySet" durch "setreading d myTestReading TEST". Das bringt erstmal nix, die Magie findet statt weil der webcmd "mySet" von dem Device "d" intern ein "set d mySet" auslöst, das wird dann durch den cmdalias eben umgemünzt in ein "setreading ..."

Habe ich das richtig verstanden? Vorteil: geht für alle Devices, Nachteil: der Ausführungsbefehl ist vom Device getrennt im cmdalias hinterlegt, das muss man beachten wenn man z.B. ein Device umbenennt weil dann der cmdalias manuell nachgeführt werden muss.

DeeSPe

Zitat von: ansgru am 06 März 2023, 16:24:50
Sehr cool, kannte ich noch gar nicht! Die Funktionsweise erschloss sich bei mir erst nach einigem Grübeln:

Ich überschreibe quasi mit cmdalias den Befehl "set d mySet" durch "setreading d myTestReading TEST". Das bringt erstmal nix, die Magie findet statt weil der webcmd "mySet" von dem Device "d" intern ein "set d mySet" auslöst, das wird dann durch den cmdalias eben umgemünzt in ein "setreading ..."

Habe ich das richtig verstanden? Vorteil: geht für alle Devices, Nachteil: der Ausführungsbefehl ist vom Device getrennt im cmdalias hinterlegt, das muss man beachten wenn man z.B. ein Device umbenennt weil dann der cmdalias manuell nachgeführt werden muss.

Das hat Du bis auf das Überschreiben richtig verstanden.
Überschrieben wird nichts denn "set d mySet" gab es ja vorher nicht.
Der set-Befehl erscheint auch nicht unter den Settern im Device.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Superposchi

Das ist im Prinzip genau das was ich suche.
Der einzige Nachteil ist wie ansgru schon schrieb, dass er bei Device-Änderung händisch nachgeflegt werden muss.

Ich wollte das für meine Dummy-Devices nutzen die alle einen Tageszähler haben welcher um Mitternacht erhöht wird und je nach Inhalt des Dummy bei bestimmten Tagesanzahlen Meldungen ausgibt. Das Reading heißt in allen Dummy's "days" und soll einfach auf Null zurückgesetzt werden.

Gäbe es theoretisch eine Möglichkeit das generisch zu schreiben, so dass ein Zusatzdevice vom Typ Aliascmd auf alle Dummy's reagiert?

DeeSPe

Zitat von: Superposchi am 06 März 2023, 18:21:51
Gäbe es theoretisch eine Möglichkeit das generisch zu schreiben, so dass ein Zusatzdevice vom Typ Aliascmd auf alle Dummy's reagiert?

Die gibt es sogar praktisch!
define d7 dummy
attr d7 webCmd resetDays

define d8 dummy
attr d8 webCmd resetDays

define d9 dummy
attr d9 webCmd resetDays

define ca_d_resetDays cmdalias set d[7-9] resetDays AS setreading $EVTPART0 days 0


Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Superposchi

Perfekt, muss ich zwar meine Dummys umbenennen, aber das ist das kleinere Übel.
Und soll ja eh nur eine Übergangslösung sein bis das neue FTUI funktioniert.

DeeSPe

Ungetestet sollte es auch so funktionieren:
define ca_d_resetDays cmdalias set (Bernd|Inge|Heinz) resetDays AS setreading $EVTPART0 days 0

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Superposchi

Bei einem Dummy getestet und funktioniert perfekt.

Aurel_B

Ich erlaube mir noch einen Querverweis für alle die, welchen diesen Thread lesen: es wäre schön, wenn man diese custom webCmds mit einem Icon versehen könnte welches je nach Wert eines Readings eine andere Farbe/Form etc. annimmt, z.B. für einen Toggle webCmd. Leider geht das nicht mit cmdIcon, siehe https://forum.fhem.de/index.php?topic=71637.0 Das geht nur mit devStateIcon, dieses Icon ist dann aber vom webCmd getrennt.

Superposchi

Devstateicon ist ja da um den jeweiligen Status des Device abzubilden.
Webcmd erlaubt es dem Anwender hingegen einem Device persönliche Befehle mitzugeben.

Da ist glaube ich wenig bis gar keine Verbindung. Ein Befehl ändert sich nicht, daher auch "sein" Icon nicht. Anders als eben der state des Device.

Beta-User

Zitat von: Superposchi am 07 März 2023, 07:59:58
Da ist glaube ich wenig bis gar keine Verbindung. Ein Befehl ändert sich nicht, daher auch "sein" Icon nicht. Anders als eben der state des Device.
Glauben heißt nicht (besser) wissen...

devStateIcon erlaubt Perl, und damit kann man im Ergebnis alles mögliche auswerten und auch mehr oder weniger jeden beliebigen FHEM-Befehl absetzen. Wenn du aber eh' in Richtung FTUI willst, ist das vermutlich nicht die Lösung, in die du viel Zeit investieren willst.
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

betateilchen

Spätestens jetzt sind wir beim Popcorn angekommen...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Aurel_B

Popcorn ist nicht so meins  ::) Nur kurz als Erläuterung: es wäre schön, wenn man cmdIcons wie oben von mir erwähnt auch Reading-abhängig setzen könnte, z.B. für folgenden Verwendungszweck: ich habe eine Temperaturregelung die ich hin- und herswitchen möchte zwischen sagen wir Tag- und Nachtschaltung. Dafür habe ich ein webcmd definiert, das wird durch ein cmdicon dargestellt. Leider kann ich nun das cmdicon nicht so ändern, dass das entsprechende Umschalticon jenach Position Tag oder Nacht z.B. eine andere Farbe annimmt.

Im Anhang ein Beispiel für ein Toggle, es ändert sich nur das devStateIcon (die Lampe), das cmdIcon (Pfeile) kann ich leider nicht beeinflussen.

Möchte nicht zu sehr offtopic gehen, ich dachte, ich erwähne das der Vollständigkeitshalber weil es ein schöner Thread ist der verschiedene Möglichkeiten für eigene webCmds aufzeigt.