NEWS
Einfaches Script aber "Probleme" mit Timeout
-
Mahlzeit zusammen,
ich nutze ioBroker bei mir für die einfachsten Sachen, in Sachen Programmierung bin ich leider nicht so fit, ich wollte grad eine Denkbar einfaches "Alarmanlagen" Script erstellen.
Falls Bewegung in meinem Lager erkannt wird, und sich mein Handy nicht im Wlan befindet eine Nachricht über Telegram.
Die Nachricht soll aber erst 1 Minute versendet werden, da es manchmal einen kurzen Augenblick dauert bis sich das Handy verbunden hat, das löst man wohl mit Timeout?
Habs jetzt so versucht, aber das klappt nicht, kann mir jemand helfen? -
@uncleb
1.000 ms sind 1 Sekunde. Ich empfehle daher den anderen Block - ist übersichtlicher:https://forum.iobroker.net/topic/70481/blockly-for-dummies-starthilfe-und-tipps/9
-
Hallo @codierknecht, danke für die Hilfe,
das funktioniert schon mal, Nachricht wird ne Minute später gesendet.
Allerdings bekomme ich die Nachricht das Bewegung erkannt wurde trotzdem.
Ich muss den Timeout zwischen den Bedingungen einbauen oder?
Also: Bewegung Erkannt -> Minute warten -> Handy immer noch offline -> Nachricht.
Kannst mir da nochmal kurz helfen? -
@uncleb sagte in Einfaches Script aber "Probleme" mit Timeout:
Kannst mir da nochmal kurz helfen?
Bin zwar nicht @Codierknecht , aber helfen kann ich.- Trigger am besten auf "ist grösser als vorher" - dann kommt der Trigger nur in dem Moment wo das erste mal Bewegung erkannt wird.
- Die Abfrage ob Handy nicht im WLan brauchst du doppelt - einmal vor dem Timeout, einmal im Timeout, damit du den Timeout nur startest wenn auch wirklich das Handy nicht im WLan ist.
- Das Stop-Timeout kann raus, besser die Abfrage das der Timeout noch nicht läuft, ansonsten wird der Timeout bei jedem neuen Auslösen des BWM gelöscht und die Meldung kommt ggf. nie.
A.
Nachtrag: Trigger auftest_dp
, Value of Objekt ID istIs online
von Deinem Beispiel oben. -
@asgothian
Ich würd's ähnlich machen. Hier mal zur Vereinfachung auf Deutsch@UncleB
Es passiert folgendes:- wenn Bewegung erkannt wird (größer als letztes), wird geprüft, ob das Handy online ist und noch kein Timer läuft.
In diesem Fall wird der timeout gestartet. - Feuert nach 1 Minute der timeout, wird nochmal geprüft, ob das Handy nicht möglicherweise inzwischen online ist.
Nur in diesem Fall wird die Meldung gesendet.
So funktioniert das auch, wenn ein "Besucher" einmal kurz den Melder auslöst und sich dann min. 1 Minute ruhig verhält.
Falls Du selbst der Besucher bist, sollte sich ja innerhalb der Minute das Handy eingeloggt haben. - wenn Bewegung erkannt wird (größer als letztes), wird geprüft, ob das Handy online ist und noch kein Timer läuft.
-
@codierknecht
Danke euch beiden, das funktioniert wunderbar, auch wenn ich den "nicht" Baustein nicht ganz verstehe.Und wenn jetzt noch paar Clienten auf die "Whitelist" sollen dann mach ich einfach n "oder" dazu
-
@uncleb sagte in Einfaches Script aber "Probleme" mit Timeout:
auch wenn ich den "nicht" Baustein nicht ganz verstehe
Ein "nicht" (not) negiert einen bool'schen Wert.
So wie Du das machst (Falls Wert von X = wahr) wäre das unnötig. Aber Programmierer sind faul, darum vereinfachen sie alle was geht.
Geprüft wird ja eine Gesamtaussage.
Ein "Wert von X = falsch" lieferttrue
, wenn der Wertfalse
ist.
Ein "Wert von X = wahr" lieferttrue
, wenn der Werttrue
ist.
In diesem Fall kann ich auch gleich schreiben "Wenn Wert von X". Denn in X steht auch nurtrue
oderfalse
.
Wenn etwas passieren soll, wenn der Wert des Objektes Xfalse
ist, nimmt man das "nicht". Denn "nicht falsch" ergibt wieder? Richtig ... "wahr".Auch komplexe Ausdrücke wie "Wert von X = 42 UND Wert von Y = 4711 ODER Wert von Z = Wahr ODER is_online" liefern nur eine einzige Aussage zurück ...
true
oderfalse
.
Und auf diese eine Aussage reagiert das "Falls".Vielleicht wird das noch klarer, wenn man sich den JS-Code ansieht:
// Laie if (occupancy == true && is_online == false) // Programmierer (schreibfaul) if (occupance && !is_online)
-
@uncleb sagte in Einfaches Script aber "Probleme" mit Timeout:
@codierknecht
Danke euch beiden, das funktioniert wunderbar, auch wenn ich den "nicht" Baustein nicht ganz verstehe.Und wenn jetzt noch paar Clienten auf die "Whitelist" sollen dann mach ich einfach n "oder" dazu
Ja, einfach mit oder (zumindest wenn es reicht das mindestens einer da ist).
Aber: Du hast die Falls-Abfrage vor dem Timeout falsch umgesetzt. Durch den Trigger auf "ist grösser als vorher" wir der Trigger nur aktiv wenn der Wert von
occupancy
vonfalsch
aufwahr
wechselt - die Abfrage ob er noch wahr ist kann also entfallen. Wichtiger wäre da die Liste der Handys' die im WLan sein sollen abzufragen, damit der Timeout gar nicht gestartet wird wenn die noch im WLan sind.A.
Nachtrag: wenn die Anzahl der Klienten grösser wird (grösser als 3), dann macht es Sinn unter 0_userdata einen eigenen Datenpunkt dafür anzulegen das alle Mobiltelefone im WLan angemeldet sind. Diesen kannst du dann auf die folgende Art und Weise aktuell halten:
Das Skript ist so aufgebaut das der Datenpunkt auf wahr steht wenn mindestens 1 Handy im WLan ist.Das ist effektiver als jedes mal wenn der BWM Auslöst alle 5 Datenpunkte abzuklappern.
-
@asgothian danke für Eure Hilfe,
das muss ich mir ansehen, allein schon das mit der Liste is mir n bisschen zuuu komplex -
@uncleb sagte in Einfaches Script aber "Probleme" mit Timeout:
@asgothian danke für Eure Hilfe,
das muss ich mir ansehen, allein schon das mit der Liste is mir n bisschen zuuu komplexWie gesagt - das mit der Liste wird erst gebraucht wenn deine "whitelist" länger wird.