perl im notify

Begonnen von Wuppi68, 08 April 2020, 21:40:35

Vorheriges Thema - Nächstes Thema

Wuppi68

Hi,
kann man das sol lassen?
MQTT2_zigbee_Ikea_Remote_1:action:.(toggle|brightness_(down|up)_click) {
  fhem 'set MQTT2_zigbee_Ikea_Trafo_1 toggle'  if $EVTPART1 eq 'toggle';
  if ($EVTPART1 eq 'brightness_up_click') {
    my $brightness = ReadingsVal( 'MQTT2_zigbee_Ikea_Trafo_1', 'brightness', 0);
    $brightness = $brightness <= 244 ? $brightness + 10 : 254;
    fhem "set MQTT2_zigbee_Ikea_Trafo_1 brightness $brightness";
  };
  if ($EVTPART1 eq 'brightness_down_click') {
    my $brightness = ReadingsVal( 'MQTT2_zigbee_Ikea_Trafo_1', 'brightness', 0);
    $brightness = $brightness >= 10 ? $brightness - 10 : 254;
    fhem "set MQTT2_zigbee_Ikea_Trafo_1 brightness $brightness";
  };
}


mit der Formatierung bin ich nicht glücklich ...
kann ich auch direkt aus dem Block in Perl springen? zb: { fhem 'set MQTT2_zigbee_Ikea_Trafo_1 toggle'; exit }  if $EVTPART1 eq 'toggle';

Danke

Ralf

Tante Edit sagte, ich solle den Code aus dem Editor nehmen ;-)
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

RichardCZ

#1
Es wäre - aus diversen Gründen - interessant herauszufinden ob im o.g. Beispiel

$brightness = min($brightness + 10, 254);

tut.  Interessant finde ich auch, dass in dem

$brightness = $brightness >= 10 ? $brightness - 10 : 254;


Beispiel nicht eigentlich

$brightness = $brightness >= 10 ? $brightness - 10 : 0;


steht. Absicht?

edit:

Zitat von: Wuppi68 am 08 April 2020, 21:40:35
kann ich auch direkt aus dem Block in Perl springen? zb: { fhem 'set MQTT2_zigbee_Ikea_Trafo_1 toggle'; exit }  if $EVTPART1 eq 'toggle';

exit nicht, aber return sollte gehen. Ohne es getestet zu haben:

if ($EVTPART1 eq 'toggle') {
    fhem 'set MQTT2_zigbee_Ikea_Trafo_1 toggle';
    return;
}


Ob man den Code sehr straffen kann, hängt davon ab, ob die brightness_up_click und brightness_down_click die einzigen events sind die da kommen können. Oder ob noch andere kommen können, die man ignorieren will.

Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

CoolTux

return geht.

Und da Du ja selbst Entwickler bist würde ich nicht fhem() nehmen sondern direkt CommandSet() finde ich sauberer.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Wuppi68

#3
cool, danke :-)

habe ein wenig geändert ;-)

und ja, es kommen noch weitere Events dazu ... will halt nur die häufigsten Events direkt am Anfang erledigen um nicht zuviel Zeit zu verlieren - der Rest kommt noch

Sieht jetzt so aus:

MQTT2_zigbee_Ikea_Remote_1:action:.(toggle|brightness_(down|up)_click) {

  if ($EVTPART1 eq 'toggle') {
    fhem 'set MQTT2_zigbee_Ikea_Trafo_1 toggle';
    return;
  };
 
  if ($EVTPART1 eq 'brightness_up_click') {
    my $brightness = min( ReadingsVal( 'MQTT2_zigbee_Ikea_Trafo_1', 'brightness', 0) + 10, 255);
  # no value > 255
    fhem "set MQTT2_zigbee_Ikea_Trafo_1 brightness $brightness";
    return;
  };
 
  if ($EVTPART1 eq 'brightness_down_click') {
    my $brightness = max( ReadingsVal( 'MQTT2_zigbee_Ikea_Trafo_1', 'brightness', 0) - 10, 0);
  # no value < 0
    fhem "set MQTT2_zigbee_Ikea_Trafo_1 brightness $brightness";
    return;
  };
}


und nach CoolTux:
MQTT2_zigbee_Ikea_Remote_1:action:.(toggle|brightness_(down|up)_click) {

  if ($EVTPART1 eq 'toggle') {
    CommandSet undef, 'MQTT2_zigbee_Ikea_Trafo_1 toggle';
    return;
  };
 
  if ($EVTPART1 eq 'brightness_up_click') {
    my $brightness = min( ReadingsVal( 'MQTT2_zigbee_Ikea_Trafo_1', 'brightness', 0) + 10, 255);
  # no value > 255
    CommandSet undef,  "MQTT2_zigbee_Ikea_Trafo_1 brightness $brightness";
    return;
  };
 
  if ($EVTPART1 eq 'brightness_down_click') {
    my $brightness = max( ReadingsVal( 'MQTT2_zigbee_Ikea_Trafo_1', 'brightness', 0) - 10, 0);
  # no value < 0
    CommandSet undef,  "MQTT2_zigbee_Ikea_Trafo_1 brightness $brightness";
    return;
  };
}


aber keine Doku zu CommandSet gefunden ;-(
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

CoolTux

Zu CommandSet habe ich auf die schnelle auch nichts gefunden. Muss man sich also aus der fhem.pl anschauen. Hilft nichts.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

nils_

ich würde den up/down anteil zusammenfassen. da geht bestimmt noch mehr (vor allem die if( ... or ...) könnte man vermutlich mit einem regex bauen, da ich das aber nicht kann hab ich es so geschrieben :) )
MQTT2_zigbee_Ikea_Remote_1:action:.(toggle|brightness_(down|up)_click) {

  if ($EVTPART1 eq 'toggle') {
    CommandSet undef, 'MQTT2_zigbee_Ikea_Trafo_1 set toggle';
    return;
  };

  if ( ($EVTPART1 eq 'brightness_up_click') or ($EVTPART1 eq 'brightness_down_click') )
  {
    my $brightness = ReadingsVal( 'MQTT2_zigbee_Ikea_Trafo_1', 'brightness', 0)
    $brightness = min( $brightness + 10, 255) if ($EVTPART1 eq 'brightness_up_click');
    $brightness = max( $brightness - 10, 0) if ($EVTPART1 eq 'brightness_down_click');
   
    CommandSet undef,  "MQTT2_zigbee_Ikea_Trafo_1 set brightness $brightness";
    return;
  }; 
}
viele Wege in FHEM es gibt!

Wuppi68

Zitat von: CoolTux am 09 April 2020, 07:06:48
Zu CommandSet habe ich auf die schnelle auch nichts gefunden. Muss man sich also aus der fhem.pl anschauen. Hilft nichts.
hatte noch ein set aus dem Code rausgenommen ...
die Syntax ist relativ einfach zu benutzen.

CommandSet undef,  "$DEVICE" $SETPARAMETER"

also aus

'fhem set Lampe on' wird CommandSet undef, 'Lampe on'
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

Wuppi68

Zitat von: nils_ am 09 April 2020, 08:47:18
ich würde den up/down anteil zusammenfassen. da geht bestimmt noch mehr (vor allem die if( ... or ...) könnte man vermutlich mit einem regex bauen, da ich das aber nicht kann hab ich es so geschrieben :) )
MQTT2_zigbee_Ikea_Remote_1:action:.(toggle|brightness_(down|up)_click) {

  if ($EVTPART1 eq 'toggle') {
    CommandSet undef, 'MQTT2_zigbee_Ikea_Trafo_1 toggle';
    return;
  };

  if ( ($EVTPART1 eq 'brightness_up_click') or ($EVTPART1 eq 'brightness_down_click') )
  {
    my $brightness = ReadingsVal( 'MQTT2_zigbee_Ikea_Trafo_1', 'brightness', 0)
    $brightness = min( $brightness + 10, 255) if ($EVTPART1 eq 'brightness_up_click');
    $brightness = max( $brightness - 10, 0) if ($EVTPART1 eq 'brightness_down_click');
   
    CommandSet undef,  "MQTT2_zigbee_Ikea_Trafo_1 brightness $brightness";
    return;
  }; 
}


Hallo nils_,

die regex dazu steht doch in der ersten Zeile ;-) da muss nur das toggle| wieder raus.

Ich habe zwar keine Performance Tests gemacht, aber mein Bauch sagt mir, das ein Vergleich mit einer regex deutlich länger braucht als eine Zuweisung.

Bei Deinem Code hast Du 1 bzw. 2 - wegen oder - Vergleiche und wenn dann der Code ausgeführt wird, 2 Zuweisungen (min und max) mit Vergleich
Bei mir ist es dann nur noch ein Vergleich ...

Wenn die Verzweigungen dann irgendwann zu viele werden, also Zuviel CPU Zeit kosten könnten, dann sollte man auf die if ... then .. elseif oder given ... select ausweichen

Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

RichardCZ

#8
So lange man sich sicher sein kann weiter oben im Code alle Events abzufangen
(und eben mit return rauszuspringen), kann man den allerletzten Zweig als Default nehmen
und sich das letzte If und sogar das return sparen (wir sind hier ja eh im eval lala-land)

Im übrigen brauchen if-Blöcke kein schliessendes Semikolon: if (x) { ...};

MQTT2_zigbee_Ikea_Remote_1:action:.(toggle|brightness_(down|up)_click) {

  if ($EVTPART1 eq 'toggle') {
    CommandSet undef, 'MQTT2_zigbee_Ikea_Trafo_1 toggle';
    return;
  }

  my $brightness = ReadingsVal( 'MQTT2_zigbee_Ikea_Trafo_1', 'brightness', 0); # edit: aber Statements brauchen schon ein Semikolon
  $brightness = min( $brightness + 10, 255) if ($EVTPART1 eq 'brightness_up_click');
  $brightness = max( $brightness - 10, 0)   if ($EVTPART1 eq 'brightness_down_click');
   
  CommandSet undef,  "MQTT2_zigbee_Ikea_Trafo_1 brightness $brightness";
}
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

Beta-User

...auch ein nettes Thema...

Frage: wäre eine regex nicht schneller als "eq"?

min dürfte "falsch" sein, => minNum

Dann haben wir in Zweig 2 eigentlich nur "up" oder "down" =>" eq 'up' ? maxNum+10 : ... ;"




Dann:
"sowas" sollte man eigentlich generalisieren...
=> warum nicht einfach das Zieldevice, den Event und die Type (100% oder 0-255) übergeben?
=> warum nicht gleich eine nichtlineare Option einbauen (nicht selten ist der Effekt 0%=>10 % sehr viel deutlicher als 80%=>90%)
=> warum nicht gleich eine Option für "nicht-HM"-like Behaviour einbauen => (optionale) selbsttriggernde loop, die bei einem "release"-Event dann unterbrochen wird...

(Wäre eine super Sache zur Darstellung, wie man von einem einfachen notify zu generalisiertem Code kommt...).
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

RichardCZ

Zitat von: Beta-User am 09 April 2020, 11:52:08
...auch ein nettes Thema...

Frage: wäre eine regex nicht schneller als "eq"?

Nein. eq ist wesentlich schneller.

Zitat
min dürfte "falsch" sein, => minNum

um Gottes Willen! dann nicht. Der Sinn der Übung sollte sein dieses vermaledeite eigene Rad durch die List::Util Funktionen zu ersetzen und lieber früher als später zu begraben.




Zu der "Meta-Ebene":

Zitat
Dann:
"sowas" sollte man eigentlich generalisieren...
=> warum nicht einfach das Zieldevice, den Event und die Type (100% oder 0-255) übergeben?
=> warum nicht gleich eine nichtlineare Option einbauen (nicht selten ist der Effekt 0%=>10 % sehr viel deutlicher als 80%=>90%)
=> warum nicht gleich eine Option für "nicht-HM"-like Behaviour einbauen => (optionale) selbsttriggernde loop, die bei einem "release"-Event dann unterbrochen wird...

(Wäre eine super Sache zur Darstellung, wie man von einem einfachen notify zu generalisiertem Code kommt...).

Zustimmung zu allem.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

mahowi

Wenn ich List::Util importiere, was hat denn dann bei Aufruf von min bzw. max Vorrang? Die Funktion aus List::Util oder die in FHEM definierte?
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

Beta-User

Zitat von: RichardCZ am 09 April 2020, 12:00:22
Nein. eq ist wesentlich schneller.
Thx!

Zitatum Gottes Willen! dann nicht. Der Sinn der Übung sollte sein dieses vermaledeite eigene Rad durch die List::Util Funktionen zu ersetzen und lieber früher als später zu begraben.
Dann würde es doch Sinn machen, die Funktion schlicht und ergreifend mit dem passenden Package-Präfix anzusprechen und gut ist, oder ;) ?

(Dann können sich die user auch sschon mal an diese Doppelpunkte gewöhnen :P .)
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

RichardCZ

Zitat von: mahowi am 09 April 2020, 12:15:00
Wenn ich List::Util importiere, was hat denn dann bei Aufruf von min bzw. max Vorrang? Die Funktion aus List::Util oder die in FHEM definierte?

Also wenn man einen eigenen Namespace hat - was man ja haben sollte - und nicht ständig im main rumfleucht, dann die Importierte.

Falls man in main rumfleucht... dann ist natürlich Ärger vorprogrammiert. Je später die Therapie, desto größer die Entzugserscheinungen.
Man hat sich zu lange Gift in die Venen gespritzt und jetzt braucht es der Körper. Ist halt Pech.

Ansonsten wie Beta-User sagte:   List::Util::min(x,y)

sieht zwas sch* aus, könnte aber derzeit eine akzeptable Übergangslösung sein.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

Wuppi68

Zitat von: Beta-User am 09 April 2020, 11:52:08




Dann:
"sowas" sollte man eigentlich generalisieren...
=> warum nicht einfach das Zieldevice, den Event und die Type (100% oder 0-255) übergeben?
=> warum nicht gleich eine nichtlineare Option einbauen (nicht selten ist der Effekt 0%=>10 % sehr viel deutlicher als 80%=>90%)
=> warum nicht gleich eine Option für "nicht-HM"-like Behaviour einbauen => (optionale) selbsttriggernde loop, die bei einem "release"-Event dann unterbrochen wird...

(Wäre eine super Sache zur Darstellung, wie man von einem einfachen notify zu generalisiertem Code kommt...).

- Generalisierung grundsätzlich immer wo es geht ;-) In meinem besonderen Falle macht es aber wenig Sinn
- die nicht lineare Funktion ist schon auf meinem Schirm, da muss aber noch ein Qualifier mit rein, der die Kurve bestimmt (LED vs. alter "Birne" vs. Dimmkurven in der Hardware)
- meine Tradfri FB möchte ich für die Long Klicks (Presses und Released) für die Sonos Steuerung benutzen ;-) - Ist aber mit den Latenzen ziemlich doof als Mensch dann zu bedienen
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen