[gelöst] DOIF für Batteriewarnung: Alias statt $DEVICE ausgeben?

Begonnen von grappa24, 29 November 2023, 17:52:47

Vorheriges Thema - Nächstes Thema

grappa24

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)
FHEM 6.1, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

Adimarantis

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";})
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

grappa24

#2
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!
FHEM 6.1, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

Adimarantis

Probier es mal mit doppelten Anführungszeichen bei den Argumenten von Debianmail. Mit einfachen gings bei mir auch nicht.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

grappa24

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.
FHEM 6.1, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

Adimarantis

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)
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

grappa24

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!
FHEM 6.1, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

Adimarantis

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.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

grappa24

#8
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)
FHEM 6.1, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

Damian

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 ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Peter aus Calw

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

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF