Auflösung Variable @ und $

Begonnen von Roaster, 17 August 2014, 22:00:02

Vorheriges Thema - Nächstes Thema

Roaster

Hi,

eine Frage zu dem unten stehenden Coding aus der fhem.cfg:

define not.BatteryCheck notify .*:[Bb]attery.low* {\
  if (ReadingsVal("dum.BatteryCheck", "state", "off") eq "off") {  \
  { fhem("set dum.BatteryCheck on") }\
    { fhem("define at.dum.BatteryCheck.@.off at +00:30:00 set dum.BatteryCheck off") }\
    { PushNotify('BAT', AttrVal($NAME,"alias",$NAME) ) }\
    Log 2, "@ Batteriestatus prüfen: %, Nachricht via eMail/SMS versendet."\
  } \
}


Wenn dieser notify ausgeführt wird, erscheint im Log:

Zitat2014.08.17 21:55:46 3: define at.dum.BatteryCheck.@.off at +00:30:00 set dum.BatteryCheck off : Invalid characters in name (not A-Za-z0-9.:_): at.dum.BatteryCheck.@.off
sowie
Zitat2014.08.17 21:55:50 2: @ Batteriestatus prüfen: %, Nachricht via eMail/SMS versendet.

Die Variabel @ und $ wird offensichtlich nicht aufgelöst. Bis vor kurzem war dies aber noch der Fall. Ich weiß leider auch nicht mehr was ich genau verändert habe, damit dies aktuell nicht mehr der Fall ist.

Ich habe auch schon
Log 2, "$DEVICE Batteriestatus prüfen: $EVENT, Nachricht via eMail/SMS versendet."\
probiert, da bekomme ich aber sowas wie:
Zitat2014.08.17 21:37:56 3: not.Battery return value: Global symbol "$DEVICE" requires explicit package name at (eval 2650) line 7.

Kann mich da mal jemand in die richtige Richtung schubsen, was ich ändern muss?

Danke,
Michael

peterk_de

define not.BatteryCheck notify .*:[Bb]attery.low* {\
  if (ReadingsVal("dum.BatteryCheck", "state", "off") eq "off") {  \
    fhem("set dum.BatteryCheck on") ;;\
    fhem("define at.dum.BatteryCheck.@.off at +00:30:00 set dum.BatteryCheck off");; \
    PushNotify('BAT', AttrVal($NAME,"alias",$NAME) ) ;;\
    Log 2, "@ Batteriestatus prüfen: %, Nachricht via eMail/SMS versendet.";;\
  } \
}


Probiers mal so (ohne geschweifte Klammern um jede Zeile, dafür mit escapten Semikolons.
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

Mitch

#2
define not.BatteryCheck notify .*:[Bb]attery.low* {\
  if (ReadingsVal("dum.BatteryCheck", "state", "off") eq "off") {\
    fhem("set dum.BatteryCheck on ;; define at.dum.BatteryCheck.off at +00:30:00 set dum.BatteryCheck off");;\
    PushNotify('BAT', AttrVal($NAME,"alias",$NAME);;\
    Log 2, "$NAME Batteriestatus prüfen: $NAME, Nachricht via eMail/SMS versendet.";;\
  }\
}


Hast ein paar Klammern zuviel.

Warum triggerst Du denn nocht auf "Batterie ist ungleich ok"?
Mit Deinem Code bekommst Du ja nur bei LOW eine Nachricht.
Und warum den deinfe at.dum.... wegen der halben Stunde warten?

Ich mache das so:
define BatteriewarnungNotify notify .*:[Bb]attery.* { if(($EVENT !~ m/ok/) && (time > $main::NewMailtime)) {\
my $alias = AttrVal($NAME,"alias",$NAME);;\
fhem ("set Pushover msg 'FHEM-WARNUNG' '$alias $EVENT'");;\
$main::NewMailtime = time + 14400;;\
Log 3, "$NAME: Batteriewarnung $EVENT";;\
}\
}


Mit dem Wetr bei ttime + kannst Du die Zeit in Sekunden einstellen, bis wieder eine Nachricht kommt.
FHEM im Proxmox Container

Roaster

Hi,

Dein Coding ist auch in der fhem.cfg? Wo und wie ist dann $main::NewMailtime definiert und auch my $alias? Bin da nicht so fit was diese Art von Programmierung angeht und bewege mich momentan ausschließlich in der fhem.cfg, abgesehen von ein paar Includes.

Dein Coding bedeutet jezt aber auch, dass nicht so wie bei mir, jeweils ein eigenes AT erzeugt wird, sondern mehr eine Art globale Wartezeit definiert wird. Wenn ich jetzt mehrere Überwachungen haben möchte, bspw. für andere Zustände, von sagen wir mal geöffneten Fenstern, dann gilt die Wartezeit, die du unter NewMailtime definiert hast auch für diese Benachrichtigungen.

Was passiert eigentlich in deinem Fall, wenn zunächst eine Batterie eine Warnungen sendet und dann innerhalb deiner bereits gestarteten Wartezeit noch eine weitere Warnung dazukommt? Erhalte ich für die zweite Warnung eine separate E-Mail? Wohl nicht, soweit ich dies korrekt deutet, weil die erste Wartezeit ja noch nicht vorüber ist.

Michael




Roaster

Um jetzt nochmals meinen ersten Ansatz weiter zu verfolgen. Nachdem ich jetzt auf ;; abgeändert habe:

define not.BatteryCheck notify .*:[Bb]attery.low* {\
  if (ReadingsVal("dum.BatteryCheck", "state", "off") eq "off") {  \
  fhem("set dum.BatteryCheck on ;; define at.dum.BatteryCheck.@.off at +00:30:00 set dum.BatteryCheck off");; \
    PushNotify('BAT', AttrVal($NAME,"alias",$NAME) );;\
    Log 2, "@ Batteriestatus prüfen: %, Nachricht via eMail/SMS versendet.";; \
  } \
}


erhalte ich nach wie vor hier
Zitat2014.08.18 13:07:25 3: set dum.BatteryCheck on ; define at.dum.BatteryCheck.@.off at +00:30:00 set dum.BatteryCheck off : Invalid characters in name (not A-Za-z0-9.:_): at.dum.BatteryCheck.@.off
und auch hier
Zitat2014.08.18 13:07:29 2: @ Batteriestatus prüfen: %, Nachricht via eMail/SMS versendet.
keine ersetzten Variablen.  >:(

Ich habe daraufhin die Idee mit $NAME und $EVENT weiter verfolgt und festgestellt, dass dies jetzt funktioniert.
define not.BatteryCheck notify .*:[Bb]attery.low* {\
  if (ReadingsVal("dum.BatteryCheck", "state", "off") eq "off") {  \
  fhem("set dum.BatteryCheck on ;; define at.dum.BatteryCheck.off at +00:30:00 set dum.BatteryCheck off");; \
    PushNotify('BAT', AttrVal($NAME,"alias",$NAME) );;\
    Log 2, "$NAME Batteriestatus prüfen: $EVENT, Nachricht via eMail/SMS versendet.";; \
  } \
}

Wohl aufgrund der jetzt verwendeten doppelten ; Zeichen.

Nachdem, wie ich jetzt fesgtgestellt habe, auch keine weitere Benachrichtigung erfolgt, weil dum.BatteryCheck ja schon auf on steht, habe ich auch die Variable @ bei define at.dum.BatteryCheck.off wieder entfernt.

Ich denke soweit läuft jetzt alles wie gewünscht.

Danke,
Michael

Mitch

#5
@ durch $NAME ersetzten und ein define auf @ oder $NAME kann nicht angelegt werden.

Und ja, bei meinem Script wird während der "Warteschlange" von 14400 sec. keine Benachrichtigung mehr geschickt.
FHEM im Proxmox Container

justme1968

der beste platz sich solche dinge wie letzte ausführung zu merken sind readings in einem device. einfach mit setreading anlegen und mir ReadingsVal abfragen. die überleben (mit save) auch ein fhem neustart.

man kann sie entweder in einen dummy stecken wenn es eine globale variable sein soll oder einzeln jeweils in das device um das es geht.

wenn man den namen mit einem punkt anfangen lässt kann man das reading auch verstecken.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Roaster

Ok, das mit dem ReadingsVal klingt besser. Wie würde es dann aussehen, wenn man die verstrichene Zeit mittels ReadingsVal  prüfen möchte?

Ich habe bereits ja so ein Konstrukt drin um den Zustand auszulesen:
if (ReadingsVal("dum.BatteryCheck", "state", "off") eq "off")

Im Falle einer gespeicherten Zeit, wird dies natürlich anders aussehen. Hast du da ein Beispiel zur Hand, wie die Ausführungszeit weggeschrieben und ausgelesen wird?

Michael

justme1968

wenn es dir nur um eine zeit zum rechnen geht ist es am einfachstem mit einem timestamp zu arbeiten:my ($current) = gettimeofday();

den letzen zeitpunkt holst du dir mit:my $last = ReadinsgVal(<device>,"lastBatWarning",0);

wenn ($current - $last) größer als dein intervall ist sendest du deine mail und setzt lastBatWarning auf $current:if( $current - $last > 60*60*24) {
  <mail senden>;
  fhem("setreading <device> lastBatWarning $current");
}


wie gesagt kannst du als device einen dummy verwenden um ein globales intervall zu haben oder du nimmst jeweils das device selber und jedes device hat dann sein eigenes intervall.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968