[gelöst] perl DOIF mit devStateIcon

Begonnen von olwaldi, 09 Oktober 2022, 12:52:03

Vorheriges Thema - Nächstes Thema

olwaldi

Ich habe schon den ganzen Vormittag ohne Ergebnis gebastelt, daher hier mein Hilferuf:

Mein Ziel ist ein perl-DOIF mit Icon, bei Klick auf das Icon  soll ein Kommando ausgeführt werden. Mir gelingt es, anstelle eines Kommandos den benannten Perrl-Block des DOIF auszuführen, aber nicht ein anderes Kommando. Ganz genau: Eigentlich soll auch genau der Perl-Block ausgeführt werden, zuvor aber ein dummy mit einem Wert belegt werden. Symbolisch etwa:

define c_ForceHdmiInput cmdalias ForceHdmiInput AS set DenonZone force;;set HisenseHdmiInput HdmiInput

define HisenseHdmiInput DOIF HdmiInput {
...
}
attr HisenseHdmiInput devStateIcon initialized:rc_BACK:ForceHdmiInput

Die Idee zu dieser (leider nicht funktionierenden) Lösung habe ich hier im Forum entdeckt. Das cmdalias soll VOR dem Aufruf von HdmiInput des DOIF noch ein dummy vorbelegen.

Durch dieses devStateIcon wird im DOIF wirklich das gewünschte, klickbare Icon angezeigt, allerrdings nicht das cmdalias ForceHdmiInput ausgeführt. Ersetze ich das ForceHdmiInput durch den DOIF-Blocknamen HdmiInput wird dieses brav ausgeführt.

Zusammengefaßt: Wie kriegt man es hin, daß das DOIF-Icon "mehr" tut?

Auch gescheitert (gar nicht erst klickbar):

attr HisenseHdmiInput devStateIcon {
  "<div href=\"/fhem?cmd=ForceHdmiInput\">" .
  FW_makeImage("rc_BACK") .
  "</div>"
}



Grüßle, Michael

Otto123

Hallo Michael,

Zitat von: olwaldi am 09 Oktober 2022, 12:52:03
klickbare Icon angezeigt, allerrdings nicht das cmdalias ForceHdmiInput ausgeführt. Ersetze ich das ForceHdmiInput durch den DOIF-Blocknamen HdmiInput wird dieses brav ausgeführt.
devStateIcon kann einen Befehl des Moduls ausführen, aber keinen externen. Ob das was Du hier konstruiert hast irgendwie gehen könnte weiß ich nicht, ich meine auf die Art nein.
Wenn der Befehl HdmiInput ausgeführt wird, dann müsstest Du deine Befehlsfolge einfach in diese DOIF Block packen?!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

olwaldi

Danke für die prompte Antwort. Beim Spazierengehn ist mir was Ähnliches eingefallen: Warum nicht einen zweiten Perl-Block anlegen, der das macht?

define HisenseHdmiInput DOIF HdmiInput {
...
}
force {
  fhem_set("DenonZone force");
  fhem_set("HisenseHdmiInput HdmiInput");
}

Sollte dann durch ein "set HisenseHdmiInput force" aufrufbar sein. dann auch via devStateIcon. Aber leider wird der quasi rekursive Aufruf desselben DOIF nicht ausgeführt, DenonZone steht auf force, aber das nachfolgende set wird nicht abgearbeitet.

Dann bleibe ich einfach bei meiner Lösung mit cmdalias - d.h. statt Button im DOIF das alias-Kommando eintippen. Ist eh' nur als "Notlösung" gedacht, wenn mal das Timing der Events (TV macht manchmal einen fullboot, derr 30s dauert) nicht paßt.


Grüßle, Michael

Damian

Man macht in einem solchen Fall das, was man immer in einer höheren Programmiersprache macht. Man programmiert zwei Funktionen, die eine macht etwas mehr als die andere. Die Funktionen rufst du dann separat jeweils in einem eigenen Perlblock auf.

Eigene Perl-Funktionen kannst du in einem subs-Block deines DOIFs programmieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

olwaldi

Da hast Du natürlich Recht. Ich schau' mal, wieoft ich diese "force" Funktionaltät überhaupt benötige. Ich tippe mal auf 1x im Jahr... Letztendlich wollte ich nur wissen, ob ich irgendwas Triviales im DOIF übersehen habe, was ja wohl nicht so ist.

Für mich ist das Thema somit gelöst.

Grüßle, Michael
PS: BTW ich bin übrigens ultrazufrieden mit fhem - läuft vollkommen problemlos und ressourcenschonend auf meinem Pi3.

olwaldi

Ich wollte es jetzt doch wissen, wie man mittels subs mein Problem lösen kann. Und es funktioniert prima. Ich mußte allerdinfs beachten, daß mein ForceHdmiInput-Block keinen Trigger braucht:

define HisenseHdmiInput DOIF
HdmiInput {
  if ([StateTV:Longpress] eq "on") {
    SetHdmi;
  }
}
ForceHdmiInput {
  fhem_set("DenonZone force");
  SetHdmi;
}
subs {
  sub SetHdmi {
     ...
  }
}
attr HisenseHdmiInput devStateIcon initialized:rc_BACK:ForceHdmiInput


Grüßle, Michael