[gelöst:]DOIF Perl Modus - erster Versuch - dynamische Anzahl Readings versenden

Begonnen von shamal2008, 27 Mai 2020, 11:10:14

Vorheriges Thema - Nächstes Thema

shamal2008

Hallo Joachim & Amenomade,

nochmal Danke vorab - ich habe jetzt das Doif von Amenomade mal rauskopiert und auf ein komplett neues gelegt. VErbose wieder auf 5 und Ergebnis wie vorher... - ist auch spannend...

2020-06-08 13:19:42 DOIF di.msg.perltest mode: enabled
2020-06-08 13:20:33 DOIF di.msg.perltest mode: enabled
2020-06-08 13:20:34 Global global MODIFIED di.msg.perltest


Das mit dem myreading hatte ich schon wieder ausgebessert, das kam aus einem copy-paste fehler mit testvariablen in der perl-umgebung.

Das Doif tut trotzdem nix...

lg Shamal
FHEM auf RasPiI 3+, MapleCUL 868+433MhZ, MAX! via CUL, LD686 LED-Controller, GHoma Plugins,, Shelly, ConbeeII + IKEA + Xiaomi, div. Infodienste & Google Assistant via FHEM;

amenomade

Und schon wenn man auf einer richtigen Perl-Syntax achtet, kriegt man zumindest keine "syntax" Fehlermeldung mehr.
{ if ([uwz.neusiedl:WarnCount, 0] ne "0") {
my $max=[uwz.neusiedl:WarnCount:d,0];
for (my $i = 0; $i <= $max-1; $i++){
my $myreading="Warn_".$i."_LongText";
if ($i == 1)
{ fhem_set ("MaLaBot 'sendImage @#Smart-MaLa-Home /tmp/neusiedl.png'")}
fhem_set("MaLaBot message ".'@#Smart-MaLa-Home PERL-WETTERWARNUNG FÜR NEUSIEDL am SEE: '.ReadingsVal("uwz.neusiedl",$myreading, ""));
}

  }
}

Ob das noch was tut, was erwartet ist, ist noch eine andere Geschichte, aber zumindest würde man mit richtigem Code anfangen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

MadMax-FHEM

#17
Was zeigst du da!?

EventMonitor!?

Da kommen nat. nur Events...
...Fehler stehen wenn dann im fhem Log (auch nur DA wirkt verbose)...

Hast du auch das setreading ausgeführt!?

Weil: OHNE dass das DOIF getriggert wird, tut es auch NICHTS!
(soviel ist sogar mir klar, obwohl ich KEIN DOIF nutze ;) )

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

shamal2008

Hallo Joachim,

im Log ist auch nichts anderes..

2020.06.08 13:10:33 4: parse status message for li.wz.panel
2020.06.08 13:10:37 3: UWZ uwz.neusiedl: UWZ.1811 Done fetching data
2020.06.08 13:11:33 4: parse status message for li.wz.panel
2020.06.08 13:12:07 1: PERL WARNING: Argument "ok" isn't numeric in numeric gt (>) at (eval 4296436) line 1.
2020.06.08 13:12:33 4: parse status message for li.wz.panel
2020.06.08 13:13:33 4: parse status message for li.wz.panel
2020.06.08 13:14:01 3: UWZ uwz.wien: UWZ.1811 Done fetching data
2020.06.08 13:14:33 4: parse status message for li.wz.panel
2020.06.08 13:15:04 1: PERL WARNING: Argument "ok" isn't numeric in numeric gt (>) at (eval 4296636) line 1.
2020.06.08 13:15:33 3: gw.deconz: websocket opened to 192.168.188.220:443
2020.06.08 13:15:33 4: parse status message for li.wz.panel
2020.06.08 13:15:33 3: gw.deconz: websocket: Switching Protocols ok
2020.06.08 13:16:33 4: parse status message for li.wz.panel
2020.06.08 13:17:33 4: parse status message for li.wz.panel
2020.06.08 13:17:57 1: PERL WARNING: Argument "ok" isn't numeric in numeric gt (>) at (eval 4296846) line 1.
2020.06.08 13:18:33 4: parse status message for li.wz.panel
2020.06.08 13:19:33 4: parse status message for li.wz.panel


edit: Der Fehler im Licht-Panel kommt von einem ungültigen Befehl, den die Fernbedienung (milight) hin- und wieder schickt. das macht er so 4-5 mal, dann ist wieder Ruhe. Ist ein Zigbee + Milight Controller :)

Das Setreading ist durchgeführt bzw. sollte ja zumindest mal ein Checkall kommen, so wie bei meinen anderen ca. 30 DOIFs.. :).

lg Thomas
FHEM auf RasPiI 3+, MapleCUL 868+433MhZ, MAX! via CUL, LD686 LED-Controller, GHoma Plugins,, Shelly, ConbeeII + IKEA + Xiaomi, div. Infodienste & Google Assistant via FHEM;

amenomade

Ein Paar Erklärungen noch, da ich in gute Laune bin ;)

for (my $i = 0; $i <= $max-1; $i++);
führt nur dazu, dass $i hochgezählt wird. Davon wird nix gemacht.
Richtige Syntax, wenn man etwas davon machen will:
for (my $i = 0; $i <= $max-1; $i++) { etwas }

$i ist im Kontext nur innerhalb der "for" Schleife nutzbar.
Wenn ich sowas schreibe:
for (my $i = 0; $i <= $max-1; $i++);
     mach etwas mit $i;

ist $i nicht bekannt => Fehlermeldung: er zählt mit $i hoch, aber danach ist $i nicht bekannt.

@ ist für Perl das Zeichen eines Array
Wenn man das in "   " nutzt, versucht Perl , es in einem String Kontext zu interpretieren. Du willst aber hier, dass @ als @ interpretiert wird. Dewegen die "single" Hochkommas in meinem Code

Wenn man sowas schreibt:
... "blabla$i_blabla"schreibt, versucht Perl "$i_blabla" zu interpretieren, und nicht "$i" und dann den Rest.
Deswegen die Vorgehensweise mit String-Konkatenation mit ".", und die single quotes, um zu vermeiden, dass irgendwas interpretiert wird
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

MadMax-FHEM

Ich habe ja (weil auch gute Laune ;) ) "ständig" mein Beispiel von "vorne" versucht "nachzuziehen" und zu kommentieren...
...aber in dem Code ist soviel "nicht gut", da komm ich ja gar nicht hinterher... ;)

Aber jetzt mal sehen was weiter kommt...

EDIT: ein \@ sollte aber auch gehen!? (hab's mal "vorne" so geändert ;)  )...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

amenomade

Naja... immerhin abhängig vom Kontekt des Aufrufs.

my @test = (1, 2, 3);
print \@test;

(print interpretiert es als String)
wird immer zu
ARRAY(0xf0d100) führen, und nicht zum Inhalt des Arrays

Dagegen wird

my @test = (1, 2, 3);
print ${\@test}[0];
den Wert "1" zurückliefern
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

MadMax-FHEM

Ja schon klar, wenn man Arrays will...
...aber hier geht es doch um ein @-Zeichen beim Versenden!?

Egal...

Wir müssen eh warten wie's weiter geht... ;)

BTW: "heftiger" Avatar ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

shamal2008

Hallo,

gut, dass ihr guter Laune seid :) - das hilft schon ungemein.

Mein Konstrukt kam mal prinzipiell daher, dass ich die Variante als "Vorbild" genommen habe:
#!/usr/local/bin/perl -w

use strict;

for(my $i = 1;$i <= 10;$i++) { print "$i\n"; }


Da wird ja sehr wohl hochgezählt und auch ausgegeben... :-\

Das "@" soll ja nicht ausgegeben werden, sondern gehört ja zur Syntax des set Befehls.... das habe ich jetzt mal aus der Klammer raus genommen.

Was mich am meisten irritiert, ist die absolute "Nullmeldung", was Fehler angeht. Das Ding rührt kein Ohrwaschel und meldet nichts, kein Fehler...

Ps: Bitte noch keine Arrays, soweit will ich hier mal gar nicht vordringen.  ;D
PPS: Hab noch ein paar Änderungen gemacht, aber weitergekommen bin ich noch nicht... siehe unten. Ach ja, und auch mal die Bedingung gegen !=0 getauscht, hat auch nichts gebracht...


{if ([uwz.neusiedl:WarnCount,0] ne "0")
  {
    my $max=([uwz.neusiedl:WarnCount:d,0]);
    for (my $i = 0; $i < $max; $i++)
    {
      my $myreading="Warn_".$i."_LongText";
  if ($i == 1)
      {
      fhem_set ("MaLaBot sendImage @#Smart-MaLa-Home /tmp/neusiedl.png");
      fhem_set ("MaLaBot message @#Smart-MaLa-Home PERL-WETTERWARNUNG FÜR NEUSIEDL am SEE: ".ReadingsVal("uwz.neusiedl",$myreading, ""));
      }
  }
  }
}


FHEM auf RasPiI 3+, MapleCUL 868+433MhZ, MAX! via CUL, LD686 LED-Controller, GHoma Plugins,, Shelly, ConbeeII + IKEA + Xiaomi, div. Infodienste & Google Assistant via FHEM;

MadMax-FHEM

#25
Dein neues for-Beispiel ist ja jetzt auch richtig!

Beachte den Strichpunkt in deinen ersten Schleifen!!

Das @ wird doch benötigt!?
Also entweder "maskieren": \@
Oder wie von amenomade vorgeschlagen einfache Anführungszeichen. Dort werden aber Variablen NICHT ausgewertet...

Mach doch mal Logausgaben in dein DOIF...
Also gleich zu Beginn...
Und ich würde JEDE Variable auch mal loggen.

Wenn es dann läuft kann man ja die Logeinträge wieder rausnehmen...

Wird denn das DOIF getriggert!?

Poste doch mal ein list davon, nachdem es gelaufen ist...
...oder du denkst es sollte gelaufen sein...

EDIT: manche Fehler kommen ja auch erst, wenn das DOIF triggert, also der Code auch durchlaufen wird... Ansonsten kommen nur "Define-Sytax-Fehler"...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

shamal2008

Hallo Joachim,

Zitat von: MadMax-FHEM am 08 Juni 2020, 20:39:46

Beachte den Strichpunkt in deinen ersten Schleifen!!

Das @ wird doch benötigt!?
Also entweder "maskieren": \@
Oder wie von amenomade vorgeschlagen einfache Anführungszeichen. Dort werden aber Variablen NICHT ausgewertet...


Gruß, Joachim

Bin jetzt mal schon ziemlich glücklich, da zumindest der "innere Teil" (also Bild + Warning_0) gesendet wird. Den Hint mit dem ";" in "den ersten Schleifen" schau ich mir morgen an, jetzt geht's ins Bett..

Habe von fhem_set auf

{fhem ("set MaLaBot sendImage @#Smart-MaLa-Home /tmp/burgenland.png");}

umgestellt. Allerdings behauptet das Log jetzt, dass ich "MaLaBot erst definen muss, obwohl die Nachricht gesendet wird... wieder was spannendes.

Wo der Unterschied zum DOIF im "nativen" Modus ist, erschliesst sich mir nicht) - siehe Code.

(set MaLaBot sendImage @#Smart-MaLa-Home /tmp/burgenland.png, set MaLaBot message @#Smart-MaLa-Home WETTERWARNUNG FÜR NEUSIEDL am SEE: [uwz.neusiedl:Warn_0_LongText])

ps: lass dich nicht vom anderen .png namen durcheinander bringen, das habe ich jetzt extra dorthin gelegt mit einer dummy.png, damit ich auch das ausschließen kann.

Das DOIF triggert übrigens über einen event-on-change attribut im UWZ-Modul auf das Reading WarnCount. Hier liegt zum Testen auch ein event-on-update drauf.

Die Fehlermeldung im Log mit aktiviertem Stacktrace poste ich lieber nicht, die sind offensichtlich aus dem Shelly-Modul und da haben sich schon einige die Finger verbrannt.. ;)

Noch einmal ein DANKE:)
FHEM auf RasPiI 3+, MapleCUL 868+433MhZ, MAX! via CUL, LD686 LED-Controller, GHoma Plugins,, Shelly, ConbeeII + IKEA + Xiaomi, div. Infodienste & Google Assistant via FHEM;

MadMax-FHEM

#27
Zitat von: shamal2008 am 09 Juni 2020, 00:05:45

Bin jetzt mal schon ziemlich glücklich, da zumindest der "innere Teil" (also Bild + Warning_0) gesendet wird. Den Hint mit dem ";" in "den ersten Schleifen" schau ich mir morgen an, jetzt geht's ins Bett..


Ich meinte eher den Unterschied zwischen deinen ersten geposteten for-Schleifen MIT Strichpunkt direkt HINTER der Schleife, also:

Zitat
for (my $i = 0; $i <= $max-1; $i++);

von hier: https://forum.fhem.de/index.php/topic,111570.msg1062001.html#msg1062001


Im Gegensatz zu der Schleife die jetzt (natürlich) geht:

Zitat
for(my $i = 1;$i <= 10;$i++) { print "$i\n"; }

bzw. dann in dein DOIF eingebaut:

Zitat
for (my $i = 0; $i < $max; $i++)


Und: ein DOIF oder notify wird NICHT von irgendeinem event-on-change Attribut getriggert! Sondern nur von einem EVENT! (oder einer Zeit o.ä.)

Was du mit event-on- Attributen allerdings beeinflusst ist nat. wann Events kommen bzw. wann evtl. keine oder weniger kommen... ;)

Und ich meinte auch nicht Fehler im Log...
...sondern Logausgaben INS fhem Log von DIR bzw. DEINEM Code!

Also:


Log3(undef, 1, "Meine Sub und ich bin an Stelle 1 und das ist der Wert der Variablen XYZ: $XYZ");


Dann kannst du nachverfolgen WO/WIE du bzw. dein Code so abläuft und welche Variablen an welcher Stelle welchen Wert haben...
...denn zu glauben, dass etwas so läuft und diesen Wert haben müsste ist anders als: ich WEISS wo es langläuft und wie die Werte SIND! ;)

Viel Spaß und Erfolg noch, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

shamal2008

Hallo Joachim,

neuer Tag, neues Glück - und das so früh am Morgen ;)

Jetzt funktioniert es, und ich denke, ich habe es auch einigermaßen verstanden   ;)

{if ([uwz.neusiedl:WarnCount,0] != "0")
  {
    my $max=([uwz.neusiedl:WarnCount:d,0]);
{fhem ("set MaLaBot sendImage @#Smart-MaLa-Home /tmp/burgenland.png");}
    for (my $i = 0; $i < $max; $i++)
    {
      my $myreading="Warn_".$i."_LongText";
      {
            {fhem ("set MaLaBot message @#Smart-MaLa-Home TEST!!! FÜR NEUSIEDL am SEE: ".ReadingsVal("uwz.neusiedl",$myreading, ""));}
      }
  }
  }
}


Danke euch beiden für die tatkräftige und laufende Unterstützung!

WARNING: Ich werde weiter versuchen, einige DOIFs auf Perl umzustellen  ;D ;D

PS: 30 Jahre sind eine lange Zeit, und damals hab ich recht viel in C programmiert, Perl hat doch irgendwie ein paar Eigenheiten und mit FHEM gemischt, wird das nochmal schwieriger ;)

lg Shamal
FHEM auf RasPiI 3+, MapleCUL 868+433MhZ, MAX! via CUL, LD686 LED-Controller, GHoma Plugins,, Shelly, ConbeeII + IKEA + Xiaomi, div. Infodienste & Google Assistant via FHEM;

Damian

Ich würde noch überflüssige Klammern und evtl. auch überflüssige Variablen weglassen:

{ if ([uwz.neusiedl:WarnCount,0] != "0")
  {
    fhem ("set MaLaBot sendImage @#Smart-MaLa-Home /tmp/burgenland.png");
    for (my $i = 0; $i < [uwz.neusiedl:WarnCount:d,0]; $i++)
    {
      fhem ("set MaLaBot message @#Smart-MaLa-Home TEST!!! FÜR NEUSIEDL am SEE: ".ReadingsVal("uwz.neusiedl","Warn_".$i."_LongText", ""));
    }
  }
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF