Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern

Begonnen von TomLee, 10 Juli 2020, 12:34:40

Vorheriges Thema - Nächstes Thema

TomLee

Jemand einen Tipp welchen Syntax der Wert des Hash haben muss das nicht

set MQTT2_Mi_Wecklicht brightness (ReadingsNum("MQTT2_Mi_Wecklicht","brightness","0")+15)


ausgeführt wird ?

Habs mit doppelten Apostrophen Innen, einfachen Aussen auch probiert, gleiches Ergebnis.

Die auskommentierten Zeilen sind die die bisher funktionierten.


Zitatif ($dudevstate eq 'Jupiter') {
      return fhem("set MQTT2_Mi_Wecklicht toggle") if $rcCode eq '0x20DF22DD' && ReadingsVal('MQTT2_Mi_Wecklicht','state','') =~ '(OFF|ON)';
   
      my %code2command = (
      '0x20DFE01F' => "(ReadingsNum('MQTT2_Mi_Wecklicht','brightness'','0')-15)",
      '0x20DF609F' => "(ReadingsNum('MQTT2_Mi_Wecklicht','brightness'','0')+15)");
      my $command = $code2command{$rcCode};
      return if !$command;
      return fhem("set MQTT2_Mi_Wecklicht brightness ".$command);
   
   #return fhem("set MQTT2_Mi_Wecklicht brightness ".(ReadingsVal('MQTT2_Mi_Wecklicht','brightness','')-15)) if $rcCode eq '0x20DFE01F';   
   #return fhem("set MQTT2_Mi_Wecklicht brightness ".(ReadingsVal('MQTT2_Mi_Wecklicht','brightness','')+15)) if $rcCode eq '0x20DF609F';
   #return fhem("set MQTT2_Mi_Wecklicht toggle") if $rcCode eq '0x20DF22DD' && ReadingsVal('MQTT2_Mi_Wecklicht','state','') =~ '(OFF|ON)';
   }

Ja, ich weiß den Namen von MQTT2_Mi_Wecklicht kann man auch noch übergeben

TomLee

Zusätzlich in geschweiften Klammern siehts gut aus:

my %code2command = (
'0x20DFE01F' => "{(ReadingsNum('MQTT2_Mi_Wecklicht','brightness','0')-15)}",
'0x20DF609F' => "{(ReadingsNum('MQTT2_Mi_Wecklicht','brightness','0')+15)}");
my $command = $code2command{$rcCode};
return if !$command;
return fhem("set MQTT2_Mi_Wecklicht brightness ".$command);


Wer den obigen Leichtsinnsfehler gesehen hat darf ihn behalten.

TomLee

Zitat von: betateilchen am 26 Juli 2020, 10:19:50
genauso unnötig wie die Anführungszeichen um $var in Each();

perl Grundlagen...


Hier kann ich sie nicht weglassen:

Zitatif ($dudevstate eq 'Jupiter') {
   return fhem("set $miweck toggle") if $rcCode eq '0x20DF22DD' && ReadingsVal($miweck,'state','') =~ '(OFF|ON)';
   my %code2command = (
   '0x20DFE01F' => "{(ReadingsNum('$miweck','brightness','0')-15)}",
   '0x20DF609F' => "{(ReadingsNum('$miweck','brightness','0')+15)}");
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $miweck brightness ".$command);
   }

sonst gibts die Meldung:

2020.12.15 00:20:26 1: ERROR evaluating my $DEV=   $evalSpecials->{'%DEV'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};ReadingsNum(MQTT2_Mi_Wecklicht,'brightness','0')-15: Bareword "MQTT2_Mi_Wecklicht" not allowed while "strict subs" in use at (eval 56763) line 1.

2020.12.15 00:20:26 3: MQTT2_DEVICE set MQTT2_Mi_Wecklicht brightness Bareword "MQTT2_Mi_Wecklicht" not allowed while "strict subs" in use at (eval 56763) line 1.

TomLee

Zitatund zum anderen war ich hier auch der Meinung, dass man das ganze eigentlich besser über eine Hash-Zuordnung lösen sollte.

Habs ja anfangs nicht für möglich gehalten, es ist mir aber wirklich gelungen.

cmdAlias zu verwenden gefällt mir mittlerweile nicht mehr so, glaub das stell ich noch um.

Zwei Custom-setter (togglePlay und mute) hab ich mir gebastelt (jetzt mit s2m) damit wurde es noch etwas kürzer.

Einen Custom-setter für mute, toggle gabs ja schon  ::)

Für einen Tipp wie man das auf Prozentwerte setzen sinnvoll umsetzt wär ich dankbar.
$strzigu ist eine structure darum hol ich mir bisher Brightness aus einem Gerät, da gibts evtl auch eine bessere Lösung ?

Zitatsub myNec32RemoteCodesHandler {
   my $sija = shift;
   my $tv = shift;
   my $strzigu = shift;
   my $miweck = shift;
   my $sondev = shift;
   my $dudev = shift;
   my $rcProtocol = shift;
   my $rcCode = shift // return;
   my $name = shift;
   chop($rcProtocol);
   my $dudevstate = ReadingsVal($dudev,'state','Sonos');
   my $sondevstate = ReadingsVal($sondev,'state','');
   my $sondevcs = ReadingsVal($sondev,'enqueuedMetadata_Title','unbekannt');
   my $sondevmute = ReadingsVal("$sondev","mute","0");
   my %rcode2cmnd = (
   '0x20DF4EB1' => 'Sonos',
   '0x20DF8E71' => 'Licht',
   '0x20DFC639' => 'Jupiter',
   '0x20DF8679' => 'Jalousie');
   my $gcmnd = $rcode2cmnd{$rcCode};
   #return if !$gcmnd;
   #Log3(undef, 3, "Das ist $rcProtocol $rcCode $dudevstate $dudev");
   
   return if ReadingsVal($tv,'state','') eq 'on';
   return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;
   
   if ($dudevstate eq 'Sonos') {
   my %rcode2cmnd = (
   '0x20DF906F' => 'mute',
   '0x20DF4EB1' => "$sondevcs",
   '0x20DF22DD' => 'toggle',
   '0x20DF7887' => 'toggleRadio',   
   '0x20DFC03F' => "volume {([$sondev:volume]-5)}",
   '0x20DF40BF' => "volume {([$sondev:volume]+5)}",
   '0x20DF4EB1' => "speak 20 Es läuft gerade $sondevcs");
   my $command = $rcode2cmnd{$rcCode};
   return if !$command;
   return fhem("set $sondev $command");
   }
   
   if ($dudevstate eq 'Licht') {
   my %code2command = (
   '0x20DF22DD' => 'toggle',
   '0x20DFE01F' => "brightness {(ReadingsNum('MQTT2_zigbee_gu10_1','brightness','')-20)}",
   '0x20DF609F' => "brightness {(ReadingsNum('MQTT2_zigbee_gu10_1','brightness','')+20)}");
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $strzigu $command");
   }
   
   if ($dudevstate eq 'Jupiter') {
   my %code2command = (
   '0x20DF22DD' => 'toggle',
   '0x20DFE01F' => "brightness {(ReadingsNum('$miweck','brightness','0')-15)}",
   '0x20DF609F' => "brightness {(ReadingsNum('$miweck','brightness','0')+15)}");
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $miweck $command");
   }
   
   if ($dudevstate eq 'Jalousie')
   {
   my %code2command = (
   '0x20DF827D' => 'close',
   '0x20DFE01F' => 'position 3',
   '0x20DF609F' => 'position 30',
   '0x20DF02FD' => 'open',
   '0x20DF22DD' => 'stop',
   '0x20DF40BF' => 'up_for_timer 1',
   '0x20DFC03F' => 'down_for_timer 1');
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $sija $command") ;
   }
   
   }



Was mir einfach nicht gelingen mag ist die/eine Statusabfrage, wenn der Wert für die "Statusabfrage" aus dem Hash kommt.

So klappt alles:

my %rcode2cmnd = (
'0x20DF4EB1' => 'Sonos',
'0x20DF8E71' => 'Licht',
'0x20DFC639' => 'Jupiter',
'0x20DF8679' => 'Jalousie');
my $gcmnd = $rcode2cmnd{$rcCode};

#Log3(undef, 3, "Das ist $rcProtocol $rcCode $dudevstate $dudev");

return if ReadingsVal($tv,'state','') eq 'on';
return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;

return fhem("saysonos $dudevstate") if $rcCode eq '0x20DF55AA';


So werden die if (Sonos,Licht,Jupiter,Jalousie) nicht mehr ausgeführt egal ob mit oder ohne return if !$gcmnd;:

   my %rcode2cmnd = (
'0x20DF4EB1' => 'Sonos',
'0x20DF8E71' => 'Licht',
'0x20DFC639' => 'Jupiter',
'0x20DF8679' => 'Jalousie',
'0x20DF55AA' => "$dudevstate"
);
my $gcmnd = $rcode2cmnd{$rcCode};
#return if !$gcmnd;
#Log3(undef, 3, "Das ist $rcProtocol $rcCode $dudevstate $dudev");

return if ReadingsVal($tv,'state','') eq 'on';
return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;
return fhem("saysonos $gcmnd");
#return fhem("saysonos $dudevstate") if $rcCode eq '0x20DF55AA';


Wenn ich den Befehl ganz ans Ende stelle klappt alles nur die "Statusabfrage" geht nicht, es wird nichts ausgeführt (bei einem 0x20DF55AA), nix steht im Log:

 
   my %rcode2cmnd = (
   '0x20DF4EB1' => 'Sonos',
   '0x20DF8E71' => 'Licht',
   '0x20DFC639' => 'Jupiter',
   '0x20DF8679' => 'Jalousie',
   '0x20DF55AA' => "$dudevstate");
   my $gcmnd = $rcode2cmnd{$rcCode};
   ...

   ...
   '0x20DF40BF' => 'up_for_timer 1',
   '0x20DFC03F' => 'down_for_timer 1');
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $sija $command") ;
   }
   return fhem("saysonos $gcmnd");
   }


Lösung für die "Statusabfrage":
Zitat
sub myNec32RemoteCodesHandler {
   my $sija = shift;
   my $tv = shift;
   my $strzigu = shift;
   my $miweck = shift;
   my $sondev = shift;
   my $dudev = shift;
   my $rcCode = shift // return;
   my $dudevstate = ReadingsVal($dudev,'state','Sonos');
   my $sondevstate = ReadingsVal($sondev,'state','Sonos');
   my $sondevcs = ReadingsVal($sondev,'enqueuedMetadata_Title','unbekannt');
   my $sondevmute = ReadingsVal("$sondev","mute","false");
   my %rcode2cmnd = (
   '0x20DF4EB1' => 'Sonos',
   '0x20DF8E71' => 'Licht',
   '0x20DFC639' => 'Jupiter',
   '0x20DF8679' => 'Jalousie',
   '0x20DF55AA' => "$dudevstate");
   my $gcmnd = $rcode2cmnd{$rcCode};
   
   Log3(undef, 3, "Das ist $rcCode $dudevstate $dudev");
   
   return if ReadingsVal($tv,'state','') eq 'on';
   return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;
   return fhem("saysonos $gcmnd") if $gcmnd eq $dudevstate;
   #return fhem("saysonos $dudevstate") if $rcCode eq '0x20DF55AA';
   if ($dudevstate eq 'Sonos') {
   my %rcode2cmnd = (
   '0x20DF906F' => 'mute',
   '0x20DF4EB1' => "$sondevcs",
   '0x20DF22DD' => 'togglePlay',
   '0x20DF7887' => 'toggleRadio',   
   '0x20DFC03F' => "volume {([$sondev:volume]-5)}",
   '0x20DF40BF' => "volume {([$sondev:volume]+5)}",
   '0x20DF4EB1' => "speak 20 Es läuft gerade $sondevcs");
   my $command = $rcode2cmnd{$rcCode};
   return if !$command;
   return fhem("set $sondev $command");
   }
   
   if ($dudevstate eq 'Licht') {
   my %code2command = (
   '0x20DF22DD' => 'toggle',
   '0x20DFC03F' => "brightness {(ReadingsNum('MQTT2_zigbee_gu10_1','brightness','')-20)}",
   '0x20DF40BF' => "brightness {(ReadingsNum('MQTT2_zigbee_gu10_1','brightness','')+20)}");
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $strzigu $command");
   }
   
   if ($dudevstate eq 'Jupiter') {
   my %code2command = (
   '0x20DF22DD' => 'toggle',
   '0x20DFC03F' => "brightness {(ReadingsNum('$miweck','brightness','0')-15)}",
   '0x20DF40BF' => "brightness {(ReadingsNum('$miweck','brightness','0')+15)}");
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $miweck $command");
   }
   
   if ($dudevstate eq 'Jalousie')
   {
   my %code2command = (
   '0x20DF827D' => 'close',
   '0x20DFE01F' => 'position 3',
   '0x20DF609F' => 'position 30',
   '0x20DF02FD' => 'open',
   '0x20DF22DD' => 'stop',
   '0x20DF40BF' => 'up_for_timer 1',
   '0x20DFC03F' => 'down_for_timer 1');
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $sija $command") ;
   }
   
   }

TomLee

ZitatFür einen Tipp wie man das auf Prozentwerte setzen sinnvoll umsetzt wär ich dankbar.

OK, statt zuvor mal nachzuschauen hab ich es jetzt erst, die sub milight_dimm bringt mich da wohl weiter, muss ich mich mit beschäftigen.

TomLee

Ein kleiner Hinweis auf die Funktionen maxNum() und minNum() wäre nett gewesen.

TomLee

Hab jetzt alles soweit umgesetzt wie es mein bisheriges Verständnis zu lässt.

Ich erhoffe mir mit diesem Post Kritik, wenn es welche gibt und/oder weitere Optimierungsvorschläge.

Bei Licht kam ein ein zusätzlicher Befehl dazu, soll ich wegen dem einen $rcCode auch auf Hash umstellen, das es einheitlich ist ?

sub
myUtils_Remotes_Initialize($$)
{
  my ($hash) = @_;
 
}

# Enter you functions below _this_ line.

sub myNec32RemoteCodesHandler {
my $wzdl = shift;
my $sija = shift;
my $tv = shift;
my $strzigu = shift;
my $miwl = shift;
my $sdev = shift;
my $dudev = shift;
my $rcCode = shift // return;
my $dudevstate = ReadingsVal($dudev,'state','Sonos');
my $sdevcs = ReadingsVal($sdev,'enqueuedMetadata_Title','unbekannt');
my $sdevs = "speak 20";
my $sdevsc = "$sdevs Es läuft gerade $sdevcs";
my $cmdb = "brightness";
my $brzu = "$cmdb {(minNum(ReadingsNum('MQTT2_zigbee_gu10_1','brightness','0')+20,255))}",
my $brzd = "$cmdb {(maxNum(ReadingsNum('MQTT2_zigbee_gu10_1','brightness','0')-20,0))}",
my $brmiwlu = "$cmdb {(minNum(ReadingsNum('$miwl','brightness','0')+15,255))}",
my $brmiwld = "$cmdb {(maxNum(ReadingsNum('$miwl','brightness','0')-15,0))}",
my $hrmiwlu = "hue {(minNum(ReadingsNum('$miwl','hue','0')+15,360))}",
my $hrmiwld = "hue {(maxNum(ReadingsNum('$miwl','hue','0')-15,0))}",
my $vrsdevu = "volume {(minNum(ReadingsNum('$sdev','volume','0')+5,40))}",
my $vrsdevd = "volume {(maxNum(ReadingsNum('$sdev','volume','0')-5,0))}",
my %rcode2cmnd = (
'0x20DF4EB1' => 'Sonos',
'0x20DF8E71' => 'Licht',
'0x20DFC639' => 'Jupiter',
'0x20DF8679' => 'Jalousie',
'0x20DF55AA' => "$dudevstate");
my $gcmnd = $rcode2cmnd{$rcCode};

#Log3(undef, 3, "Das ist $rcCode $dudevstate $dudev");

return if ReadingsVal($tv,'state','') eq 'on';
return fhem("set $dudev $gcmnd;set $sdev $sdevs $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;
return fhem("set $sdev $sdevs $gcmnd") if $gcmnd && $dudevstate eq $gcmnd;

if ($dudevstate eq 'Sonos') {
my %rcode2cmnd = (
'0x20DF906F' => 'mute',
'0x20DF22DD' => 'toggle',
'0x20DF7887' => 'toggleRadio',
'0x20DF40BF' => "$vrsdevu",
'0x20DFC03F' => "$vrsdevd",
'0x20DF4EB1' => "$sdevsc");
my $command = $rcode2cmnd{$rcCode};
return if !$command;
return fhem("set $sdev $command");
}

if ($dudevstate eq 'Licht') {
my $l = ReadingsVal("$wzdl","sceneList","unknown");
my $cmd = "scene ";
$cmd .= Each($wzdl, $l);
return fhem("set $wzdl $cmd") if $rcCode eq '0x20DF7887';
my %code2command = (
'0x20DF22DD' => 'toggle',
'0x20DF40BF' => "$brzu",
'0x20DFC03F' => "$brzd");
my $command = $code2command{$rcCode};
return if !$command;
return fhem("set $strzigu $command");
}

if ($dudevstate eq 'Jupiter') {
my %code2command = (
'0x20DF22DD' => 'toggle',
'0x20DF00FF' => "$hrmiwlu",
'0x20DF807F' => "$hrmiwld",
'0x20DF40BF' => "$brmiwlu",
'0x20DFC03F' => "$brmiwld");
my $command = $code2command{$rcCode};
return if !$command;
return fhem("set $miwl $command");
}

if ($dudevstate eq 'Jalousie')
{
my %code2command = (
'0x20DF827D' => 'close',
'0x20DFE01F' => 'position 3',
'0x20DF609F' => 'position 30',
'0x20DF02FD' => 'open',
'0x20DF22DD' => 'stop',
'0x20DF40BF' => 'up_for_timer 1',
'0x20DFC03F' => 'down_for_timer 1');
my $command = $code2command{$rcCode};
return if !$command;
return fhem("set $sija $command") ;
}
}

Beta-User

Na ja, ist immer etwas schwierig mit Kritik, wenn man die Devices nicht hat...

Sieht aber "eigentlich" für meine Augen ziemlich ok aus.

Anmerkungen:
- Initialize ist zwar nach "Lehrbuch", aber das ist m.E. outdated...
sub myUtils_Remotes_Initialize {
  my $hash = shift//return;
  return;
}

- Es werden ziemlich viele Argumente übergeben; ist unübersichtlich. Evtl. würde es Sinn machen, den JSON weiterzureichen und den dann erst in der Funktion auseinanderzunehmen?
- MQTT2_zigbee_gu10_1 ist noch hart vercoded. Absicht?
- weitere Ein- und Ausrückungen würden ggf. noch zur Übersichtlichkeit beitragen ;) .
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 für das mit dem Initialize.

Verstehe (oder doch nicht) erstmal nur das du jetzt den Ausführungsteil in geschweiften Klammern eines notify hier als JSON bezeichnest/siehst, was er ja ist, mit dem auseinandernehmen muss ich noch etwas grübeln wie das umzusetzen ginge, ich komm denk ich drauf, brauch bloss etwas.

MQTT2_zigbee_gu10_1 ist noch drin weil ich irgendwie noch am zweifeln bin ob es richtig ist den Wert aus dieser einen (von sechs) zu holen um dann der structure (alle sechs) einen brightness-Wert zu übergeben, geht doch aber nicht anders ?


Beta-User

Nein, ich dachte, das könnte ggf. direkt aus der readingList des IR-Tasmota aufgerufen werden? Dann würde man $EVENT übergeben, was DORT (noch) ein JSON wäre, mit der Perl-Funktion oder dem notify hätte das nichts mehr zu tun.

Das mit der gu10 scheint mir dann so ok zu sein, falls die structure keinen geeigneten Wert hat...
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

Jetzt dämmerts, aber nur ganz leicht, muss ich drüber schlafen (mehrmals  ;D)

Danke.

Beta-User

Na dann gute Nacht!  ;D

Falls du Anschauungsmaterial suchst: die "neue" Version der MiLight-Geschichte macht genau das: den JSON intern auspacken und dann die gewünschten Aktionen auslösen. Da da der Topic unterscheidlich ist, ist es einfacher festzustellen, welche Funktion aufgerufen werden soll, aber für die Tasmota-Sache könnte man einfach eine Regex auf den $EVENT vorneweg prüfen lassen, ob das was für die Funktion ist, oder eben für eine andere...
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

Kann mich bitte jemand von meinem Unverständnis befreien.

Gegeben:
defmod MQTT2_Cube MQTT2_DEVICE zigbee_0x00158d00028aedf7
attr MQTT2_Cube IODev MQTT2_Server
attr MQTT2_Cube devicetopic zigbee2mqtt/0x00158d00028aedf7
attr MQTT2_Cube group Wohnzimmer
attr MQTT2_Cube imageLink /fhem/deviceimages/mqtt2/MFKZQ01LM.jpg
attr MQTT2_Cube jsonMap battery:batteryPercent voltage:batterymV
attr MQTT2_Cube model zigbee2mqtt_aqara_cube
attr MQTT2_Cube readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }\
zigbee2mqtt/0x00158d00028aedf7:.* { json2nameValue($EVENT) }
attr MQTT2_Cube room MQTT2_DEVICE
attr MQTT2_Cube stateFormat Action: action
attr MQTT2_Cube userReadings batteryVoltage:batterymV.* {ReadingsNum($name,'batterymV',0)/1000}

setstate MQTT2_Cube Action: wakeup
setstate MQTT2_Cube 2021-02-26 13:15:36 action wakeup
setstate MQTT2_Cube 2021-02-26 13:15:36 angle 111.12
setstate MQTT2_Cube 2021-02-25 22:14:27 associatedWith MQTT2_zigbee_Bridge
setstate MQTT2_Cube 2021-02-25 17:39:15 attrTemplateVersion 20200904
setstate MQTT2_Cube 2021-02-26 13:15:36 battery 45
setstate MQTT2_Cube 2021-02-26 13:15:36 batteryPercent 45
setstate MQTT2_Cube 2021-02-26 13:15:36 batteryVoltage 2.905
setstate MQTT2_Cube 2021-02-26 13:15:36 batterymV 2905
setstate MQTT2_Cube 2021-02-25 22:41:14 from_side 1
setstate MQTT2_Cube 2021-02-26 13:15:36 linkquality 2
setstate MQTT2_Cube 2021-02-26 13:15:36 side 5
setstate MQTT2_Cube 2021-02-25 22:41:14 to_side 2
setstate MQTT2_Cube 2021-02-26 13:15:36 voltage 2905


Events bei action tap:
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube angle: 111.12
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube side: 5
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube voltage: 2905
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube battery: 45
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube linkquality: 2
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube action: tap
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube batterymV: 2905
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube batteryPercent: 45
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube linkquality: 2
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube action: tap
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube side: 5
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube angle: 111.12
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube batteryVoltage: 2.905


notify:
defmod not_MQTT2_Cube notify MQTT2_Cube:(action|side):.* {cube($NAME,$EVENT,$EVTPART0,$EVTPART1,'OG_Echo_Wohnzimmer')}

setstate not_MQTT2_Cube 2021-02-26 13:19:09
setstate not_MQTT2_Cube 2021-02-26 12:55:03 state active


sub:
sub cube {
my $NAME = shift;
my $EVENT = shift;
my $EVTPART0 = shift;
my $EVTPART1 = shift;
my $echo = shift;
chop($EVTPART0);
my $sr = ReadingsNum($NAME,'side',0);

Log3(undef, 3, "Das ist $NAME, $EVENT, $EVTPART0, $EVTPART1");

if ($EVTPART1 eq "tap") {

my %sr2cmnd = (
'0' => "Gastzugang",
'1' => 'Gastzugang eins',
'2' => 'Gastzugang 7 Tage',
'3' => 'Gast eins 21 Tage',
'4' => "Rollo",
'5' => "TV");
my $cmnd = $sr2cmnd{$sr};

return if !$cmnd;
return fhem("set $echo speak $cmnd");

}
}


Es klappt alles wie vorgesehen. Die Sprachausgabe erfolgt nur einmal.

Im Log steht aber zweimal:
2021.02.26 13:39:34 3: Das ist MQTT2_Cube, action: tap, action, tap
2021.02.26 13:39:34 3: Das ist MQTT2_Cube, action: tap, action, tap


edit: kann das echodevice-Modul die Befehle nur nicht so schnell ausführen und es erfolgt nur eine Sprachausgabe ?




Warum wird hier wenn ich den Text/Befehl übergebe return fhem("$cmnd"); immer zweimal ausgeführt ?
edit: kann das echodevice Modul den sounds Befehl vlt- schneller verarbeiten und darum wird jetzt zweimal ausgeführt ?

Mit dem obigen notify:
2021.02.26 13:32:59 3: Das ist MQTT2_Cube, action: tap, action, tap
2021.02.26 13:32:59 3: Das ist MQTT2_Cube, side: 0, side, 0
2021.02.26 13:32:59 3: Das ist MQTT2_Cube, side: 0, side, 0
2021.02.26 13:32:59 3: Das ist MQTT2_Cube, action: tap, action, tap


Und wenn ich das notify ändere:
defmod not_MQTT2_Cube notify MQTT2_Cube:action:.* {cube($NAME,$EVENT,$EVTPART0,$EVTPART1,'OG_Echo_Wohnzimmer')}

setstate not_MQTT2_Cube 2021-02-26 13:36:07
setstate not_MQTT2_Cube 2021-02-26 13:34:10 state active


ebenfalls zweimal:

2021.02.26 13:34:27 3: Das ist MQTT2_Cube, action: tap, action, tap
2021.02.26 13:34:27 3: Das ist MQTT2_Cube, action: tap, action, tap


es geht nur um den ersten Hash (die anderen ignorieren)

sub cube {
my $NAME = shift;
my $EVENT = shift;
my $EVTPART0 = shift;
my $EVTPART1 = shift;
my $echo = shift;
chop($EVTPART0);
my $sr = ReadingsNum($NAME,'side',0);

my $sound = "set $echo sounds Glocken";
#$sound .= ";(system ('/opt/fhem/vouchergzg.sh &'))";

Log3(undef, 3, "Das ist $NAME, $EVENT, $EVTPART0, $EVTPART1");

if ($EVTPART1 eq "tap") {

my %sr2cmnd = (
'0' => "$sound",
'1' => 'Gastzugang eins',
'2' => 'Gastzugang 7 Tage',
'3' => 'Gast eins 21 Tage',
'4' => 'Rollo',
'5' => 'TV');
my $cmnd = $sr2cmnd{$sr};

return if !$cmnd;
return fhem("$cmnd");

}
}


Was mach ich beim Trigger mglw. falsch ?

Beta-User

Warum hast du (indirekt) 2x dasselbe "abo" in der readingList?
(Oder lese ich das falsch?)
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

War mir gar nicht aufgefallen, die Readinglist wurde offensichtlich so ergänzt nachdem ich das erweiterte Template (aus dem andern Thread) angewendet hatte, die Readings hatte ich nicht zuvor gelöscht.

Nur ein ReadinList-Eintrag ändert aber nix an dem Verhalten oben.