FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: grappa24 am 29 November 2023, 17:52:47

Titel: [gelöst] DOIF für Batteriewarnung: Alias statt $DEVICE ausgeben?
Beitrag von: grappa24 am 29 November 2023, 17:52:47
Hi,
ist es möglich in dem Aufruf von DebianMail unten statt dem Devicenamen $DEVICE den Alias des Device auszugeben?
[$DEVICE:alias] hab ich schon probiert, geht aber leider nicht ...

([":battery: low"] and [?$SELF:B_$DEVICE] ne "low") ({DebianMail('abc@xyz.de', 'FHEM - battery warning from device: $DEVICE','Bitte die Batterie im Gerät $DEVICE erneuern')}, setreading $SELF B_$DEVICE low) DOELSEIF ([":battery: ok"] and [?$SELF:B_$DEVICE] ne "ok") (setreading $SELF B_$DEVICE ok)
Titel: Aw: DOIF für Batteriewarnung: Alias statt $DEVICE ausgeben?
Beitrag von: Adimarantis am 29 November 2023, 19:15:08
Das hole ich direkt aus dem Attribut, also deinen Fall zum Testen etwas vereinfacht:
   ({ my $alias=AttrVal("$DEVICE","alias",""); print "FHEM - battery warning from device: $DEVICE ($alias)\n"}) \
 DOELSEIF ([":battery: ok"]) ({print "ok\n";})
Titel: Aw: DOIF für Batteriewarnung: Alias statt $DEVICE ausgeben?
Beitrag von: grappa24 am 29 November 2023, 23:34:02
guter Ansatz!

Die Zuweisung zu $alias erfolgt korrekt, aber ich krieg $alias nicht in der Funktion DebianMail ausgewertet.

([":battery: low"] and [?$SELF:B_$DEVICE] ne "low") ({my $alias=AttrVal("$DEVICE","alias","")}, {DebianMail('alarm@xyz.de', 'FHEM - battery warning from device: $alias','Bitte die Batterie im Gerät $alias erneuern')}, setreading $SELF B_$DEVICE low) DOELSEIF ([":battery: ok"] and [?$SELF:B_$DEVICE] ne "ok") (setreading $SELF B_$DEVICE ok)
2023.11.29 23:25:29 2: notifier_batt_warning: {my $alias=AttrVal("dg_fenster_rechts","alias","")}: Dachfenster_Rechts
2023.11.29 23:25:29 1: sendEmail RCP: alarm@xyz.de
2023.11.29 23:25:29 1: sendEmail Subject: FHEM - battery warning from device: $alias
2023.11.29 23:25:29 1: sendEmail Text: Bitte die Batterie im Gerät $alias erneuern
2023.11.29 23:25:30 1: sendEmail returned: Nov 29 23:25:30 raspberrypi sendEmail[5199]: Email was sent successfully!
Titel: Aw: DOIF für Batteriewarnung: Alias statt $DEVICE ausgeben?
Beitrag von: Adimarantis am 30 November 2023, 07:11:38
Probier es mal mit doppelten Anführungszeichen bei den Argumenten von Debianmail. Mit einfachen gings bei mir auch nicht.
Titel: Aw: DOIF für Batteriewarnung: Alias statt $DEVICE ausgeben?
Beitrag von: grappa24 am 30 November 2023, 09:01:28
geht leider auch nicht  :(   Vielleicht muss ich $alias global definieren?


([":battery: low"] and [?$SELF:B_$DEVICE] ne "low") ({my $alias=AttrVal("$DEVICE","alias","")}, {DebianMail("alarm@xyz.de", "FHEM - battery warning from device: $alias","Bitte die Batterie im Gerät $alias erneuern")}, setreading $SELF B_$DEVICE low) DOELSEIF ([":battery: ok"] and [?$SELF:B_$DEVICE] ne "ok") (setreading $SELF B_$DEVICE ok)
2023.11.30 08:50:25 2: notifier_batt_warning: {my $alias=AttrVal("bd_fenster","alias","")}: Fenster Bad
2023.11.30 08:50:25 1: PERL WARNING: Possible unintended interpolation of @xyz in string at (eval 790285) line 1.
2023.11.30 08:50:25 3: eval: {DebianMail("alarm@xyz.de", "FHEM - battery warning from device: $alias","Bitte die Batterie im Gerät $alias erneuern")}
2023.11.30 08:50:25 1: ERROR evaluating {DebianMail("alarm@xyz.de", "FHEM - battery warning from device: $alias","Bitte die Batterie im Gerät $alias erneuern")}: Global symbol "@xyz" requires explicit package name (did you forget to declare "my @xyz"?) at (eval 790285) line 1.
Global symbol "$alias" requires explicit package name (did you forget to declare "my $alias"?) at (eval 790285) line 1.
Global symbol "$alias" requires explicit package name (did you forget to declare "my $alias"?) at (eval 790285) line 1.

2023.11.30 08:50:25 2: notifier_batt_warning: {DebianMail("alarm@xyz.de", "FHEM - battery warning from device: $alias","Bitte die Batterie im Gerät $alias erneuern")}: Global symbol "@xyz" requires explicit package name (did you forget to declare "my @xyz"?) at (eval 790285) line 1.
Global symbol "$alias" requires explicit package name (did you forget to declare "my $alias"?) at (eval 790285) line 1.
Global symbol "$alias" requires explicit package name (did you forget to declare "my $alias"?) at (eval 790285) line 1.
Titel: Aw: DOIF für Batteriewarnung: Alias statt $DEVICE ausgeben?
Beitrag von: Adimarantis am 30 November 2023, 09:06:55
Du hast die Befehle in verschiedenen Perl Shells - da ist die Variable wahrscheinlich dann nicht mehr gültig.
Warum trennst du das?
Und ein bisschen Formatierung würde es lesbaren machen, als alles in eine Zeile zu klatschen  :)

Würde das so machen:
([":battery: low"] and [?$SELF:B_$DEVICE] ne "low")
    ({
      my $alias=AttrVal("$DEVICE","alias","");
      DebianMail("alarm@xyz.de", "FHEM - battery warning from device: $alias","Bitte die Batterie im Gerät $alias erneuern");
     },
    setreading $SELF B_$DEVICE low
    )
DOELSEIF ([":battery: ok"] and [?$SELF:B_$DEVICE] ne "ok")
    (setreading $SELF B_$DEVICE ok)
Titel: Aw: DOIF für Batteriewarnung: Alias statt $DEVICE ausgeben?
Beitrag von: grappa24 am 30 November 2023, 09:31:28
Log mit "...":
2023.11.30 09:22:08 1: PERL WARNING: Possible unintended interpolation of @xyz in string at (eval 803196) line 1.
2023.11.30 09:22:08 3: eval: {       my $alias=AttrVal("lu_fenster","alias","");       DebianMail("alarm@xyz.de", "FHEM - battery warning from device: $alias","Bitte die Batterie im Gerät $alias erneuern");      }
2023.11.30 09:22:08 1: ERROR evaluating {       my $alias=AttrVal("lu_fenster","alias","");       DebianMail("alarm@xyz.de", "FHEM - battery warning from device: $alias","Bitte die Batterie im Gerät $alias erneuern");      }: Global symbol "@xyz" requires explicit package name (did you forget to declare "my @xyz"?) at (eval 803196) line 1.

2023.11.30 09:22:08 2: notifier_batt_warning: {       my $alias=AttrVal("lu_fenster","alias","");       DebianMail("alarm@xyz.de", "FHEM - battery warning from device: $alias","Bitte die Batterie im Gerät $alias erneuern");      }: Global symbol "@xyz" requires explicit package name (did you forget to declare "my @xyz"?) at (eval 803196) line 1.

Log mit '...':
2023.11.30 09:27:51 1: sendEmail RCP: alarm@xyz.de
2023.11.30 09:27:51 1: sendEmail Subject: FHEM - battery warning from device: $alias
2023.11.30 09:27:51 1: sendEmail Text: Bitte die Batterie im Gerät $alias erneuern
2023.11.30 09:27:52 1: sendEmail returned: Nov 30 09:27:52 raspberrypi sendEmail[21140]: Email was sent successfully!
Titel: Aw: DOIF für Batteriewarnung: Alias statt $DEVICE ausgeben?
Beitrag von: Adimarantis am 30 November 2023, 09:33:53
Schaut so aus als müsstest du das @ entweder escapen: \@
Oder du packst die Mailadresse in einfache Anführungszeichen, aber den Teil mit alias in doppelte.
Titel: Aw: DOIF für Batteriewarnung: Alias statt $DEVICE ausgeben?
Beitrag von: grappa24 am 30 November 2023, 10:12:11
Zitat von: Adimarantis am 30 November 2023, 09:33:53Oder du packst die Mailadresse in einfache Anführungszeichen, aber den Teil mit alias in doppelte.
Damit gehts es tatsächlich ;D die andere Variante mit \@ hab ich nicht mehr getestet ...
P.S. Danke für deine Hilfe
P.P.S. Wenn es einen Aufkleber "Ich hasse Perl" gäbe, ich hätte den aufm Auto hinten  :)
P.P.P.S Und ich hab mal mit C und C++ gearbeitet  :-X

Hier der funktionierende Code:
([":battery: low"] and [?$SELF:B_$DEVICE] ne "low")
    ({
      my $alias=AttrVal("$DEVICE","alias","");
      DebianMail('alarm@xyz.de', "FHEM - battery warning from device: $alias","Bitte die Batterie im Gerät $alias erneuern");
     },
    setreading $SELF B_$DEVICE low
    )
DOELSEIF ([":battery: ok"] and [?$SELF:B_$DEVICE] ne "ok")
    (setreading $SELF B_$DEVICE ok)
Titel: Aw: [gelöst] DOIF für Batteriewarnung: Alias statt $DEVICE ausgeben?
Beitrag von: Damian am 30 November 2023, 10:44:11
Zitat von: grappa24 am 30 November 2023, 10:12:11Damit gehts es tatsächlich ;D die andere Variante mit \@ hab ich nicht mehr getestet ...
P.S. Danke für deine Hilfe
P.P.S. Wenn es einen Aufkleber "Ich hasse Perl" gäbe, ich hätte den aufm Auto hinten  :)
P.P.P.S Und ich hab mal mit C und C++ gearbeitet  :-X

Wenn du eine lokale Variable in einem Block definierst, dann ist sie in einem anderen Block nicht bekannt, das ist auch bei C und C++ so ;)
Titel: Aw: [gelöst] DOIF für Batteriewarnung: Alias statt $DEVICE ausgeben?
Beitrag von: Peter aus Calw am 22 Dezember 2023, 21:56:29
Guten Abend,
möchte mich hier noch mit meinem Problem anhängen :
habe den Batteriecod für meinen Wunsch angepasst :
([":state: CMDs_pending"] and [?$SELF:B_$DEVICE] ne "CMDs_pending") ({Debian...........[center][/center]
damit möchte ich bei CMDs_pending länger 3 Minuten (mit "wait" eine Mail erhalten - was aber leider nicht funktioniert - es gibt bei pendings keine Reaktion ?
Würde mich über einen Tipp sehr freuen und wünsche allen ein gesegnetes Weihnachtsfest
Titel: Aw: [gelöst] DOIF für Batteriewarnung: Alias statt $DEVICE ausgeben?
Beitrag von: Damian am 24 Dezember 2023, 13:41:45
Hallo Peter

state wird im Gegensatz zu anderen Readings nicht im Event angezeigt, also musst du state weglassen. Am besten vorher im Event schauen, was da mit "CMDs_pending" im Event kommt.

Gruß

Damian