[gelöst] Frage zu readingsage im doif

Begonnen von deppennase, 23 September 2018, 22:48:58

Vorheriges Thema - Nächstes Thema

deppennase

Hallo,

ich versuche seit einigen Tagen folgende Anforderung abzubilden:

Über eine FS20-Steckdose kann ich mein IPad an der Wand einschalten. Allerdings darf das nur einmal alle 2 min erfolgen, da sonst das iPad einen Abschalte-Dialog anzeigt. Ausserdem würde ich gerne, wenn die letzte Aktivierung über 1h zurück liegt eine 2. Aktivierung nach 20s vornehmen.

Aktuell liefert mein Bewegungsmelder die Info ob das iPad angehen soll. Cmdpause funktioniert prinzipiell, aber da der Bewegungsmelder etwas unregelmässig sendet, hätte ich gerne, dass er für jedes Mal pro 2min in denen eine Bewegung gemeldet wird die Steckdose erneut einschaltet, und zwar immer 121s nach dem letzten Einschalten.

Ich dachte, ich löse die Anforderung, dass nur alle 121s aktiviert wird über ein DOIF mit 121- readingsage der Steckdose:

#define IpadSteuerung DOIF ([BewegungsmelderKueche:state] eq "motion" and [ReadingsAge(IpadOn,state,0)] > 3600) (set IpadOn on-for-timer 0.1 , sleep 20, set IpadOn on-for-timer 0.1) DOELSEIF ([BewegungsmelderKueche:state] eq "motion") (sleep {120-[ReadingsAge(IpadOn,state,0)]}, set IpadOn on-for-timer 0.1)

Leider klappt das nicht wie gewünscht. Was mache ich falsch?

Vielen Dank!

Ellert

nicht [ReadingsAge(IpadOn,state,0)] sondern ReadingsAge(IpadOn,state,0)

deppennase

Super, danke für die schnelle Antwort.

Ich möchte, dass bei der erneuten Auslösung 120s-das ReadingsAge gewartet wird:

(sleep {120-[ReadingsAge(IpadOn,state,0)]}

Also hier einfach (sleep {120-ReadingsAge(IpadOn,state,0)}? Ist das sleep auf der Ebene OK?



deppennase

#4
Danke für den Hinweis auf die Commandref.

Ich dachte mit einer Promotion in molekularer Krebsforschung und dem Management internationaler IT-Projekte hätte man schon einiges an Komplexität gesehen, aber FHEM ist doch echt ne Hausnummer...
Seit Tagen versuche ich verschiedene Schreibweisen, bemühe die Referenzen und suche nach analogen Beispielen, aber ich wollte nicht noch eine Woche an dem Problem verzweifeln. Allerdings habe ich lange damit gehadert, meine Frage hier zu posten.

Laut der Referenzen und dem Hinweis, dass das ReadingsAge nicht in eckige Klammern soll würde ich denken, dass es so richtig ist:


define IpadSteuerung DOIF ([BewegungsmelderKueche:state] eq "motion" and ReadingsAge(IpadOn,state,0) > 3600) (set IpadOn on-for-timer 0.25, sleep 21, set IpadOn on-for-timer 0.25) DOELSEIF ([BewegungsmelderKueche:state] eq "motion") (sleep {([121]+ReadingsAge(IpadOn,state,0))}, set IpadOn on-for-timer 0.1)

Dann kommt aber:
condition c01: Bareword "IpadOn" not allowed while "strict subs" in use at (eval 155076) line 1. Bareword "state" not allowed while "strict subs" in use at (eval 155076) line 1.

Wäre es doch so richtig?


define IpadSteuerung DOIF ([BewegungsmelderKueche:state] eq "motion" and ReadingsAge(IpadOn,state,0) > 3600) (set IpadOn on-for-timer 0.25, sleep 21, set IpadOn on-for-timer 0.25) DOELSEIF ([BewegungsmelderKueche:state] eq "motion") (sleep {([121]+[ReadingsAge(IpadOn,state,0))]}, set IpadOn on-for-timer 0.1)


Ein funktionierendes Beispiel mit ReadingsAge könnte vielleicht auch für andere hilfreich sein.




Frank_Huber

Versuch mal
ReadingsAge("IpadOn" ,"state" ,0)

Gefunden hier:
https://www.google.de/search?q=ReadingsAge+fhem+Beispiel+doif

Gesendet von meinem Doogee S60 mit Tapatalk


deppennase

Das hier (Hochkommas im Berechnungsteil):


([BewegungsmelderKueche:state] eq "motion" and ReadingsAge(IpadOn,state,0) > 3600) (set IpadOn on-for-timer 0.25, sleep 21, set IpadOn on-for-timer 0.25) DOELSEIF ([BewegungsmelderKueche:state] eq "motion") (sleep {([121]+[ReadingsAge("IpadOn","state",0)])}, set IpadOn on-for-timer 0.25)


macht gar nix, Fehler wie vorher (Bareword...).

Das hier (beide ReadingsAge mit Hochkommas):

define IpadSteuerung DOIF ([BewegungsmelderKueche:state] eq "motion" and ReadingsAge("IpadOn","state",0) > 3600) (set IpadOn on-for-timer 0.25, sleep 21, set IpadOn on-for-timer 0.25) DOELSEIF ([BewegungsmelderKueche:state] eq "motion") (sleep {([121]+[ReadingsAge("IpadOn","state",0)])}, set IpadOn on-for-timer 0.25)

brachte mein FHEM so zum Absturz, dass mein Raspi nicht mal mehr einen Reboot geschafft hat und ich den Stecker ziehen musste als in der Küche der Bewegungsmelder ausgelöst wurde.

Frank_Huber

Du hast auch wieder eckige klammern dran.

Gesendet von meinem Doogee S60 mit Tapatalk


deppennase

Das mit den Eckigen Klammern im Berechnungsteil führt zum Absturz und der Meldung:

WARNING: sleep without additional commands is deprecated and blocks FHEM

Ist ja eigentlich explizit genug, aber danach habe ich doch noch das "set XXX on-for-timer"? Komisch.

Ist es dann so richtig? Hiermit geht er mir immerhin einmal an, aber geht in die 1. Bedingung in die er nur nach 1h Pause gehen soll, hier ist das reading aber erst ein paar Minuten alt.

define IpadSteuerung DOIF ([BewegungsmelderKueche:state] eq "motion" and ReadingsAge("IpadOn","state","0") > 3600) (set IpadOn on-for-timer 0.25, sleep 21, set IpadOn on-for-timer 0.25) DOELSEIF ([BewegungsmelderKueche:state] eq "motion") (sleep {([121]+ReadingsAge("IpadOn","state","0"))}, set IpadOn on-for-timer 0.25)

Sobald er dann in die 2. Schleife zu gehen scheint (das ist etwas schwierig zu überprüfen) ist FHEM wieder bis zum Neustart des Raspis komplett blockiert.


Ellert

Zitat von: deppennase am 24 September 2018, 21:40:13
Laut der Referenzen und dem Hinweis, dass das ReadingsAge nicht in eckige Klammern soll würde ich denken, dass es so richtig ist:

Dann kommt aber:
condition c01: Bareword "IpadOn" not allowed while "strict subs" in use at (eval 155076) line 1. Bareword "state" not allowed while "strict subs" in use at (eval 155076) line 1.
Jemandem mit Promotion sollte Recherchearbeit nicht schwerfallen

FHEM ist in Perl geschrieben, das liest man auf jeder Einstiegsseite. Wenn man Perl nutzt, gilt die Perl-Syntax, über die man sich informieren sollte.

Auch die Befehlsreferenz ist eine Hilfe, dort nach ReadingsAge gesucht, findet man
ZitatReadingsAge(<devicename>,<reading>,<defaultvalue>)

Liest man weiter, gibt es ein Beispiel, für die Verwendung einer Perl-Funktion
Zitat{ ReadingsVal("wz", "measured-temp", "20")+0 }
, damit sollte es nicht schwer sein auch ReadingsAge richtig zu formulieren.

Spätestens nach nach der Fehlermeldung und der Suche nach der Bedeutung sollte klar sein, dass Anführungszeichen fehlen. Erster Treffer bei der Suche nach 'Perl Bareword  not allowed while "strict subs"'  liefert die Antwort https://de.perlmaven.com/barewords-in-perl .

ZitatWARNING: sleep without additional commands is deprecated and blocks FHEM

Ist ja eigentlich explizit genug, aber danach habe ich doch noch das "set XXX on-for-timer"? Komisch.

Hier kann der DOIF-Befehlstrenner nicht verwendet werden, da sleep dann den nachfolgenden Befehl nicht erkennt, es ist daher der übliche FHEM-Befehlstrenner zu verwenden. Wegen dieses Umstands ist die Sleep-Alternative im DOIF das Attribut wait.

deppennase

#10
Erstmal nochmal herzlichen Dank für die wertvolle und geduldige Hilfe.

Dank Eurer Unterstützung läuft es jetzt, alleine hätte ich es nicht hinbekommen.

Warum ich die Hochkommas übersehen habe weiß ich nicht, ich habe auch die ReadingsVal schon korrekt verwendet. Tut mir leid.

Es scheint soweit zu funktionieren, nur den letzten letzte Teil habe ich mit Sleep nicht hinbekommen.

Wenn ich den FHEM-üblichen Befehlstrenner ";;" nach dem Sleep verwende, legte es mir immer noch (inkl. der Fehlermeldung im Log) FHEM lahm.
Oder habe ich bei dem FHEM-üblichen Befehlstrenner etwas übersehen?

([BewegungsmelderKueche:state] eq "motion") (sleep {([121]-ReadingsAge("IpadOn","state","0"))};; set IpadOn on-for-timer 0.25)

Es funktioniert einwandfrei mit wait, hier die funktionierende Version:

define IpadSteuerung DOIF ([BewegungsmelderKueche:state] eq "motion" and ReadingsAge("IpadOn","state",0) > 180) (set IpadOn on-for-timer 0.25) (set IpadOn on-for-timer 0.25) DOELSEIF ([BewegungsmelderKueche:state] eq "motion" and ReadingsAge("IpadOn","state","0") > 110 and ReadingsAge("IpadOn","state","0") < 179) (set IpadOn on-for-timer 0.25) DOELSEIF ([BewegungsmelderKueche:state] eq "motion") (set IpadOn on-for-timer 0.25)
attr IpadSteuerung do always
attr IpadSteuerung wait 0,5:0:{(109-ReadingsAge("IpadOn","state","0"))}

Damian

#11
Kann man so machen.

Strukturierter ohne wiederholende Angaben würde man das aber so definieren:

define IpadSteuerung DOIF {
if ([BewegungsmelderKueche:state] eq "motion") {
  fhem_set("IpadOn on-for-timer 0.25");
  if (ReadingsAge("IpadOn","state",0) > 180) {
     set_Exec("on",5,'fhem_set("IpadOn on-for-timer 0.25")'); # Befehl um 5 Sekunden verzögert
  } elsif (ReadingsAge("IpadOn","state",0) <= 110) {
     set_Exec("on",109-ReadingsAge("IpadOn","state","0"),'fhem_set("IpadOn on-for-timer 0.25")'); # Befehl verzögert
  }
}
}


ohne Attribute

siehe: https://fhem.de/commandref_DE.html#DOIF_Perl_Modus
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

netbus

Hallo,
ich möchte da gerne nochmal nachhacken.
Ich möchte auf ein x-beliebiges Device triggern doch ich bekomme einen Fehler

defmod di.mqtt_lwt DOIF {if (["^MQTT"] and ReadingsAge($DEVICE,"state",0) > 60) {fhem_set"Pushover1 msg 'MQTT' '$DEVICE down' '' 1 'incoming' 30 3600"}}

condition c01: Bareword "MQTT2_Waschmaschine" not allowed while "strict subs" in use, line 1.

Was mache ich falsch?

Ellert