[gelöst] Wie weitere Fhem-Befehle nach Verkettung mit Perl-Code ?

Begonnen von TomLee, 07 Mai 2021, 16:59:31

Vorheriges Thema - Nächstes Thema

TomLee

Hallo,

Muss ich hier:
Zitatdefmod not_TABA_motemp notify TABA:screen:.on.locked {\
my $temp=ReadingsVal('HF_Aussensensor_Vorderhaus','temperature','0');;\
my $dev='MQTT2_WLED_TV';;\
fhem("set $dev on;;set $dev rgb ".substr(Color::pahColor(0,15,30,$temp,2,0),0,6));;\
return fhem("sleep TABA:screen:.off.locked;;set $dev off")
}
attr not_TABA_motemp disabledForIntervals 09:00-24:00 00:00-04:30
attr not_TABA_motemp room Wohnzimmer

zwei Fhem-Befehle machen oder kann man das doch irgendwie noch verketten ?


Hätte es mir so in der Art vorstellen können [das ist jetzt aus der DEF kopiert) wird aber von der "Syntaxprüfung" nicht akzeptiert wird:
ZitatTABA:screen:.on.locked {
my $temp=ReadingsVal('HF_Aussensensor_Vorderhaus','temperature','0');
my $dev='MQTT2_WLED_TV';
fhem("set $dev on;set $dev rgb ".substr(Color::pahColor(0,15,30,$temp,2,0),0,6)).";sleep TABA:screen:.off.locked;set $dev off");}

Gruß

Thomas

Beta-User

"dreckige" Verkettungen (also das Mischen von Code und Text) sind sowieso nicht perlcritic-konform und schlecht lesbar.

Warum nimmst du nicht einfach eine weitere Variable (für den substr) und packst die dann in den endgültigen fhem-Befehl?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

#2
Ist mir direkt nach dem schreiben selbst gekommen (oder sagen wir mal 5 Minuten später) ::)

defmod not_TABA_motemp notify TABA:screen:.on.locked {\
my $temp = ReadingsVal('HF_Aussensensor_Vorderhaus','temperature','0');;\
my $pc = substr(Color::pahColor(0,15,30,$temp,2,0),0,6);;\
my $dev = 'MQTT2_WLED_TV';;\
return fhem("set $dev on;;set $dev rgb $pc;;sleep TABA:screen:.off.locked;;set $dev off");;}
attr not_TABA_motemp comment 09:00-24:00 00:00-04:30
attr not_TABA_motemp room Wohnzimmer


Trotzdem Danke.

TomLee

Hast auch eine Idee wie man es ohne weitere Event-Handler umsetzen kann das die Farbe angepasst wird bei Änderung der Temperatur ?

Mein Gedanke ist bisher (und den find ich nicht so toll, weil ständig (interval) geprüft würde) ein notify auf die Temperatur anzusetzen (statt dem Tablet) und dann prüfen ob das Tablet an ist oder wär das OK ?

Beta-User

Ähm, das sind jetzt etwas wenig Zusammenhänge...

Wenn es ein Event am Anzeige-Device gibt, könntest du vielleicht stateFormat (oder devStateIcon) nutzen (oder ein userReadings).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Komm ich nicht mit, hab ich zu wenig Infos geliefert und du hast mich vermutlich nicht verstanden.

Ich möchte das die Farbe des LED-Streifen, in der Zeit in der das Tablet (TABA) an ist auch nach Temperaturänderung angepasst wird.

Entweder mach ich das mit einem zusätzlichen notify, das nach Temperaturänderung prüft ob Tablet an ist und dann die Farbe anpasst oder ich mach das mit nur einem notify (auf die Temperatur) das in der Zeit von 04:30-09:00 ständig im Intervall prüft ob Tablet an (dann aber mit Verzögerung beim einschalten) ist und dann die Farbe des Streifens anpasst.




TomLee

offensichtlich immer noch nicht verständlich ausgedrückt.

Ich versuchs mit dem Beispiel welches ich mir vorstellen kann, aber den Nachteil hat das der Streifen erst beim nächsten Interval vom Temperatursensor angeht und nicht wie ichs gerne hätte direkt wie beim notify oben.

defmod HF_Aussensensor_Vorderhaus_notify_1 notify HF_Aussensensor_Vorderhaus:temperature:.* {\
my $pc = substr(Color::pahColor(0,15,30,$EVTPART1,2,0),0,6);;\
my $dev = 'MQTT2_WLED_TV';;\
if (ReadingsVal('TABA','screen','off unlocked') eq 'on unlocked')\
{fhem("set $dev:FILTER=state!=on on;;set $dev rgb $pc;;sleep TABA:screen:.off.unlocked;;set $dev off");;}}
attr HF_Aussensensor_Vorderhaus_notify_1 disabledForIntervals 09:00-24:00 00:00-04:30


edit:

So in der Art macht mans vermutlich:

defmod HF_Aussensensor_Vorderhaus_notify_1 notify (HF_Aussensensor_Vorderhaus:temperature:.*|TABA:screen:.on.unlocked) {\
my $devtr = ReadingsVal('TABA','screen','off unlocked');;\
my $dev = 'MQTT2_WLED_TV';;\
my $pc = substr(Color::pahColor(0,15,30,ReadingsVal('HF_Aussensensor_Vorderhaus','temperature','0'),2,0),0,6);;\
\
if ($NAME eq 'TABA') {\
return fhem("set $dev:FILTER=state!=on on;;set $dev rgb $pc;;sleep TABA:screen:.off.unlocked;;set $dev off");;\
}\
\
if ($NAME eq 'HF_Aussensensor_Vorderhaus') {\
my $pcn = substr(Color::pahColor(0,15,30,$EVTPART1,2,0),0,6);;\
if ($devtr eq 'on unlocked'){\
fhem("set $dev:FILTER=state!=on on;;set $dev rgb $pcn;;sleep TABA:screen:.off.unlocked;;set $dev off");;}\
}\
}

TomLee

Hab ehrlich gesagt noch nie so ein Konstrukt (eventbasiertes sleep), wie zuletzt gezeigt, das immer wieder aufgerufen wird (Temperaturänderung) gebaut.
Bei jeder Temperaturänderung gibts damit ein neues sleep und der LED-Streifen wird somit wird x-mal ausgeschaltet wenn der Screen des Tablet ausgeschaltet wird.

Hab den sleeps jetzt einen Namen gegeben und lösche jedesmal bei Temperaturänderung:
defmod not_TABA_motemp notify (HF_Aussensensor_Vorderhaus:temperature:.*|TABA:screen:.on.unlocked) {\
my $devtr = ReadingsVal('TABA','screen','off unlocked');;\
my $dev = 'MQTT2_WLED_TV';;\
my $pc = substr(Color::pahColor(0,15,30,ReadingsVal('HF_Aussensensor_Vorderhaus','temperature','0'),2,0),0,6);;\
\
if ($NAME eq 'TABA') {\
return fhem("set $dev:FILTER=state!=on on;;set $dev rgb $pc;;sleep TABA:screen:.off.unlocked bla;;set $dev off");;\
}\
\
if ($NAME eq 'HF_Aussensensor_Vorderhaus') {\
my $pcn = substr(Color::pahColor(0,15,30,$EVTPART1,2,0),0,6);;\
fhem ("cancel bla quiet");;\
if ($devtr eq 'on unlocked'){\
return fhem("set $dev:FILTER=state!=on on;;set $dev rgb $pcn;;sleep TABA:screen:.off.unlocked bla;;set $dev off");;}\
}\
}


Ich mein das passt soweit, hätte das gerne aber von jemandem der sich auskennt bestätigt.

Beta-User

Kann sein, dass es passt, aber mir kommt es umständlich vor. Ich _glaube_, das hier macht dasselbe, aber übersichtlicher:

defmod not_TABA_motemp notify HF_Aussensensor_Vorderhaus:temperature:.*|TABA:screen:.on.unlocked {\
  return if ReadingsVal('TABA','screen','off unlocked') ne 'on unlocked';;\
  my $dev = 'MQTT2_WLED_TV';;\
  fhem ("cancel bla quiet") if ($NAME eq 'HF_Aussensensor_Vorderhaus');;\
  my $pc = substr(Color::pahColor(0,15,30,ReadingsVal('HF_Aussensensor_Vorderhaus','temperature','0'),2,0),0,6);;\
  return fhem("set $dev:FILTER=state!=on on;;set $dev rgb $pcn;;sleep TABA:screen:.off.unlocked bla;;set $dev off");;\
}


Hintergrund:
- Die ganzen Readings sind ja schon aktualisiert, wenn der Event kommt. Man kann das also abfragen, unabhängig davon, woher der Trigger kam.
- Aktualisiert werden soll nur, solange der screen an ist => direkt raus, wenn das nicht der Fall ist.
- cancel soll nur bei Aktualisierung via Tempsensor erfolgen,
- der Rest ist sowieso identisch, oder?



Der Weg via externem Event-Handler ist hier vermutlich schöner/übersichtlicher, da du ja am Ende einen "echten" set-Command rausschieben willst. Ggf. könnte man noch irgendwo (im notify?) den alten Temp- oder RGB-Wert zwischenspeichern und auch da nochmal vergleichen, aber das würde dann den Code wieder verlängern, was jedenfalls dann unnötig ist, wenn die Temperatur nicht alle Naselang neu triggert.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Danke, sehr cool die Umsetzung, verstehe ganz genau, verinnerlicht ist es noch nicht, kommt aber.

Teste ich später/heute Abend, erst die Arbeit dann das Vergnügen  :D

Das die Klammern beim Suchmuster unnötig sind, ist mir gestern Abend bei einem anderen notify auf ein CALLMONITOR-Device  (das mich schon lange beschäftigt) bewusst geworden.

TomLee

Ich find gut das man es nicht mehr sieht, stelle mir aber die Frage warum mit meiner Variante das (versteckte mit .) sleep  bei Probably associated with am MQTT2_WLED_TV angezeigt wurde und mit deiner Variante nicht ? Es existiert ja, sonst würde beim Tablet ausschalten nicht der Streifen ausgeschaltet.

Beta-User

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

TomLee

Ups, Denkfehler es ist natürlich am TABA-Device vorhanden.  ::)