NEWS
Script Umsetzung für das "Badewannen"-Prinzip
-
Liebe Leute,
im Homematic Forum wurde an manchen Stellen schon über das "Badewannen"- diskutiert, das speziell bei Anwesenheiten, bzw bei Bewegungsmeldern angewendet wird.
Funktioniert so (Beispiel Bewegungsmelder in der Garage)
-
jedes Mal wenn eine Bewegung erkannt wird, wird zu einer Variablen z.B. 10 addiert.
-
solange die Variable nicht kleiner, gleich 0 ist werden alle 5 Sekunden wieder z.B. 2 subtrahiert
-
ist die Variable größer als 0 ist das Licht an, bei kleiner, gleich 0 aus.
So wird reges Treiben im Carport dazu führen, dass das Licht länger ein bleibt, als wenn nur die Katze mal kurz vorbei schleicht.
Nur - wie setzt man sowas programmtechnisch sinnvoll um? Ein Script via Schedule alle 5 Sekunden zu starten ist ja eigentlich ein Overkill wenn es 23 Stunden am Tag nicht gebraucht wird. Aber wie aktiviere ich das Badewannen Programm bei Bedarf = die erste Bewegung wird erkannt oder die Variable ist noch nicht kleiner, gleich 0 und lass' von meiner Variablen einen Wert wieder abziehen?
Liebe Grüße
tom
-
-
Hallo,
ich würde das mit Zeitverzögerungen lösen:
Dein Script startet immer bei Bewegung erkannt.
Beim ersten mal setzt es eine Variable auf ein 1 und schalter die Lampe an.
Dann start des löschen Skriptes Zeitverzögert um 25 Sekunden mit Parameter 1.
Bewegung innerhalb 25 Sekunden erkannt:
Variable auf 2 setzten. Start Löschenskript mit Parameter 2 in 50 Sekunden.
Wird jetzt das Löschenskript aufgerufen mit Parameter eins, weiss es dass es nichts zu tun hat,
da die Variable auf zwei steht.
Wird das Löschenskript mit Parameter 2 aufgerufen, dann das Licht ausgeschalter und die Variable auf 0 gesetzt.
Beim Bewegungsmelder würde ich noch eine Triggerung alle max. 5 Sekunden einstellen.
-
…OK, das ist ein guter Lösungsansatz...darauf wäre ich nicht gekommen.
Danke!
tom
-
Hallo,
ich mache das seit gut einem Jahr. Bisher werte ich die Daten nicht aus, es läuft einfach so mit.
Pro Raum werden zwei States angelegt:
<list type="lower-alpha">4. Bewegung zeigen und- Bewegung zaehlen. Die Wohnung gilt zusätzlich als ein Raum, der alle BWM einbezieht.
Bedeutung:
<list type="lower-alpha">4. Bewegung zeigen ist für VIS. Die Variable wird bei Bewegung auf true gesetzt, nach 10s wieder auf false. Somit kann ich in VIS über die Sichtbarkeit eines Widgets eine bemerkte Bewegung anzeigen lassen. Ein weiterer Taster in VIS dient zum vorzeitigen Setzen er Variable auf false (also zum Ausblenden).- Bewegung zaehlen ist ein Counter, der Pro Auslösung eins hochzählt und um Mitternacht auf 0 gesetzt wird. Für den Abluss der Badewanne wird zum Beispiel im Kinderzimmer per schedule alle 2 Minuten eins heruntergezählt.
! ````
/* Bewegungen zaehlen
! für hofi77 http://forum.iobroker.net/viewtopic.php?f=21&t=1703#p14520
! erstellt: 14.11.2015 von Pix
04.12.2015 nach Räumen gegliedert und von VIS abgekoppelt (Ordnerstruktur)
21.12.2015 WC hinzugefügt
17.06.2016 Büro in Kinderzimmer umbenannt
/
! / #############################################################################ganze Wohnung (Count Motion wird von anderen Räumen mit hochgezählt)
*/
createState('Bewegung.Wohnung.zeigen', false, {
type: 'boolean',
name: 'Bewegung in der Wohnung in VIS anzeigen',
desc: 'Steuervariable für VIS Widget Sichtbarkeit'
});! createState('Bewegung.Wohnung.zaehlen', 0, {
type: 'number',
name: 'Zahl der Bewegungen in der Wohnung',
desc: 'Counter für Auslösungen aller Bewegungsmelder in der Wohnung'
});
! var idWohnung_CountMotion = 'Bewegung.Wohnung.zaehlen',
idWohnung_ShowMotion = 'Bewegung.Wohnung.zeigen';
! // alle Bewegungsmelder der Wohnung
$('channel[state.id=.MOTION]').on(function (obj) {
if (obj.state.val) { // Wenn Bewegung erkannt
setState(idWohnung_CountMotion, ++getState(idWohnung_CountMotion).val); // eins hochzählen
setState(idWohnung_ShowMotion, true); // Steuerung VIS-Widget Sichtbarkeit auf wahr
setStateDelayed(idWohnung_ShowMotion, false, 10000); // nach 10.000 ms wieder ausblenden
} // Ende Bewegung erkannt
});
! // ab 03.1.16 wieder jede Minute
schedule('/1 * * * ', function () {
var counter_wohnung = getState(idWohnung_CountMotion).val;
if (counter_wohnung > 0) {
setState(idWohnung_CountMotion, --counter_wohnung);
}
});
! / #############################################################################Kinderzimmer (1x PIR)
*/
createState('Bewegung.Kinderzimmer.zeigen', false, {
read: true,
write: true,
type: 'boolean',
name: 'Bewegung im Kinderzimmer in VIS anzeigen',
desc: 'Steuervariable für VIS Widget Sichtbarkeit'
});! createState('Bewegung.Kinderzimmer.zaehlen', 0, {
read: true,
write: true,
type: 'number',
name: 'Zahl der Bewegungen im Kinderzimmer',
desc: 'Counter für Auslösungen des Bewegungsmelders im Kinderzimmer'
});
! var idKinderzimmer_Bewegungsmelder = 'hm-rpc.0.GEQ0007961.1.MOTION'/IR Büro.MOTION/,
idKinderzimmer_CountMotion = 'Bewegung.Kinderzimmer.zaehlen',
idKinderzimmer_ShowMotion = 'Bewegung.Kinderzimmer.zeigen';
! on({
id: idKinderzimmer_Bewegungsmelder,
val: true
}, function (obj) {
if (obj.state.val) {
var counter_kinderzimmer = getState(idKinderzimmer_CountMotion).val; // bisherige Zahl aus Variable einlesen
setState(idKinderzimmer_CountMotion, ++counter_kinderzimmer); // eins hochzählen
setState(idKinderzimmer_ShowMotion, true); // Steuerung VIS-Widget Sichtbarkeit auf wahr
setStateDelayed(idKinderzimmer_ShowMotion, false, 10000); // nach 10.000 ms wieder ausblenden
}
});
! schedule('*/2 * * * ', function () {
var counter_kinderzimmer = getState(idKinderzimmer_CountMotion).val;
if (counter_kinderzimmer > 0) {
setState(idKinderzimmer_CountMotion, --counter_kinderzimmer);
}
});
! / #############################################################################Wohnzimmer (1x PIR)
*/
createState('Bewegung.Wohnzimmer.zeigen', false, {
read: true,
write: true,
type: 'boolean',
name: 'Bewegung im Wohnzimmer in VIS anzeigen',
desc: 'Steuervariable für VIS Widget Sichtbarkeit'
});! createState('Bewegung.Wohnzimmer.zaehlen', 0, {
read: true,
write: true,
type: 'number',
name: 'Zahl der Bewegungen im Wohnzimmer',
desc: 'Counter für Auslösungen des Bewegungsmelders im Wohnzimmer'
});
! var idWohnzimmer_Bewegungsmelder = "hm-rpc.0.IEQ0374891.1.MOTION"/IR Wohnzimmer.MOTION/,
idWohnzimmer_CountMotion = 'Bewegung.Wohnzimmer.zaehlen',
idWohnzimmer_ShowMotion = 'Bewegung.Wohnzimmer.zeigen';
! on({
id: idWohnzimmer_Bewegungsmelder,
val: true
}, function (obj) {
var counter_wohnzimmer = getState(idWohnzimmer_CountMotion).val; // bisherige Zahl aus Variable einlesen
setState(idWohnzimmer_CountMotion, ++counter_wohnzimmer); // eins hochzählen
setState(idWohnzimmer_ShowMotion, true); // Steuerung VIS-Widget Sichtbarkeit auf wahr
setStateDelayed(idWohnzimmer_ShowMotion, false, 10000); // nach 10.000 ms wieder ausblenden
});
! // ab 19.12. mal alle 2min
schedule('*/2 * * * ', function () {
var counter_wohnzimmer = getState(idWohnzimmer_CountMotion).val;
if (counter_wohnzimmer > 0) {
setState(idWohnzimmer_CountMotion, --counter_wohnzimmer);
}
});
! / #############################################################################WC (1x PIR)
*/
createState('Bewegung.WC.zeigen', false, {
read: true,
write: true,
type: 'boolean',
name: 'Bewegung im WC in VIS anzeigen',
desc: 'Steuervariable für VIS Widget Sichtbarkeit'
});! createState('Bewegung.WC.zaehlen', 0, {
read: true,
write: true,
type: 'number',
name: 'Zahl der Bewegungen im WC',
desc: 'Counter für Auslösungen des Bewegungsmelders im WC'
});
! var idWC_Bewegungsmelder = "hm-rpc.0.LEQ0643126.1.MOTION"/IR WC.MOTION/,
idWC_CountMotion = 'Bewegung.WC.zaehlen',
idWC_ShowMotion = 'Bewegung.WC.zeigen';
! on({
id: idWC_Bewegungsmelder,
val: true
}, function (obj) {
var counter_wc = getState(idWC_CountMotion).val; // bisherige Zahl aus Variable einlesen
setState(idWC_CountMotion, ++counter_wc); // eins hochzählen
setState(idWC_ShowMotion, true); // Steuerung VIS-Widget Sichtbarkeit auf wahr
setStateDelayed(idWC_ShowMotion, false, 10000); // nach 10.000 ms wieder ausblenden
});
! // ab 19.12. mal alle 2min
schedule('*/2 * * * ', function () {
var counter_wc = getState(idWC_CountMotion).val;
if (counter_wc > 0) {
setState(idWC_CountMotion, --counter_wc);
}
});
! / #############################################################################Reset
*/
! // Mitternacht Zähler zurücksetzen / ggf. mit Nachtruhe zurücksetzen
schedule('0 0 * * *', function () {
//setState(idWohnung_CountMotion, 0);
//setState(idKinderzimmer_CountMotion, 0);
//setState(idWohnzimmer_CountMotion, 0);
});Die Küche habe ich noch gar nicht mit drin (da sind zwei Bewegungsmelder). Der "Abfluss" für die Wohnung passiert minütlich. Für die Auswertung sollte man natürlich die "zählen"-Datenpunkte mit History loggen. Ein Durchschnittswert der letzten Stunde/des letzten Tags von 0 kann dann auf Abwesenheit hindeuten. Wie gesagt, die Auswertung habe ich noch nicht gemacht. Gruß Pix
-
@pix:Hallo,
ich mache das seit gut einem Jahr. Bisher werte ich die Daten nicht aus, es läuft einfach so mit.
Pro Raum werden zwei States angelegt:
<list type="lower-alpha">4. Bewegung zeigen und- Bewegung zaehlen. Die Wohnung gilt zusätzlich als ein Raum, der alle BWM einbezieht.
Bedeutung:
<list type="lower-alpha">4. Bewegung zeigen ist für VIS. Die Variable wird bei Bewegung auf true gesetzt, nach 10s wieder auf false. Somit kann ich in VIS über die Sichtbarkeit eines Widgets eine bemerkte Bewegung anzeigen lassen. Ein weiterer Taster in VIS dient zum vorzeitigen Setzen er Variable auf false (also zum Ausblenden).- Bewegung zaehlen ist ein Counter, der Pro Auslösung eins hochzählt und um Mitternacht auf 0 gesetzt wird. Für den Abluss der Badewanne wird zum Beispiel im Kinderzimmer per schedule alle 2 Minuten eins heruntergezählt. `
Servus pix,
danke für das tolle Script + Erklärung! DIe Idee mit der Anzeige auf VIS ist auch eine gute Idee.
Eine Frage hab ich noch dazu: der Schedule-Teil wird dann ja eigentlich alle zwei Minuten aufgerufen auch wenn die Variable 0 ist, oder? Wenn nein, fein - wenn ja, kann man das dann mit einem clearSchedule abfangen und wieder stoppen solange die Variable auf 0 steht?
Liebe Grüße
tom
-
Hmmm, aber ist den Pixs Lösung das Gleiche wie die Thread-Frage?
Denn bei pix wird ein Bewegungszähler verwendet.
Tom hingegen will doch eine längere Verzögerung bei mehreren Bewegungen.
Ich würde es so für mich mit einem Skript lösen:
1.) Ich definiere eine Info-Variable 'var_counter=0;' 2.) Starte eine subscripten 'on', die auf den/die BWM (BeWegungsMelder) triggert. 3.) Addiere var_counter=var_counter+10; 3a.) while (solange) var_counter => 2 ist... 3ab.) starte function mit SetTimeout auf 5000ms. Diese Funktion subtrahiert 2 : var_counter=var_counter-2 3b.) else (ansonsten) breche die subscripten ab (unsubscribe).
So ist alles schön zusammen und keine Asynchronität, wenn doch mal ein Skript ausversehen aus ist. Dann klappt das nämlich alles nicht mehr.
Übrigens: Machen die Homematic BWM das nicht von alleine, wenn man den richtigen Modus einstellt, oder?
So long,
Fitti
-
Hmmm, aber ist den Pixs Lösung das Gleiche wie die Thread-Frage?
Denn bei pix wird ein Bewegungszähler verwendet.
Tom hingegen will doch eine längere Verzögerung bei mehreren Bewegungen.
Ich würde es so für mich mit einem Skript lösen:
1.) Ich definiere eine Info-Variable 'var_counter=0;' 2.) Starte eine subscripten 'on', die auf den/die BWM (BeWegungsMelder) triggert. 3.) Addiere var_counter=var_counter+10; 3a.) while (solange) var_counter => 2 ist... 3ab.) starte function mit SetTimeout auf 5000ms. Diese Funktion subtrahiert 2 : var_counter=var_counter-2 3b.) else (ansonsten) breche die subscripten ab (unsubscribe).
So ist alles schön zusammen und keine Asynchronität, wenn doch mal ein Skript ausversehen aus ist. Dann klappt das nämlich alles nicht mehr.
Übrigens: Machen die Homematic BWM das nicht von alleine, wenn man den richtigen Modus einstellt, oder?
So long,
Fitti `
Servus Fitti,deine Idee schaut noch einfacher aus.
Ja die Melder im dynamischen Mode machen sowas ähnliches…ich bin gerade bei der Installation des ganzen Systems im Carport und kann daher noch nicht genau sagen, wie das nun tut.
Auf jeden Fall hängen die Bewegungsmelder nicht direkt an den Aktoren, sondern es wird alles über die CCU gesteuert.
Grund warum die Verzögerung egal ist:
Beim Rausgehen aus dem Haus ins Carport geht das Licht mit dem Öffnen der Tür an, bzw eben mit Verzögerung aber bis man durch die Tür ist ist auch schon das Licht an und beim Heimkommen mit dem Auto wird das Licht schon von weiter weg via Fernbedienung gestartet.
D.h. ich möchte mit den beiden Bewegungsmeldern quasi nur steuern, dass man draußen dann nie im Dunkeln steht und das Licht aber auch nicht zu lange brennt.
Weiters hab ich die Melder so montiert, dass die rumschleichenden Katzen eigentlich nicht dedektiert werden sollten, wenn aber doch (weil die Autos nicht da sind und dann etwas "mehr Boden" dedektiert werden kann) und es folgt keine weitere Bewegung, dann ist das Licht auch gleich wieder aus.
So der Plan
Liebe Grüße
Tom
-
Hallo
Ich habe mal hier
http://forum.iobroker.net/viewtopic.php … 654#p45130
ein Beispiel gepostet.
Grüße
-
….aja, super - danke dir!!
Ich bin eh noch am Werkeln wie ich das nun einsetzen werde/soll/möchte.
Hab nun auch zwei Foscam FI9900P im Einsatz die ich da auch irgendwie mitsteuern möchte und muss mir alles noch auf Sinnhaftigkeit durch denken
Liebe Grüße
tom
-
@etv:…muss mir alles noch auf Sinnhaftigkeit durch denken `
Das "Badewannenprinzip" macht nicht überall Sinn.Bei mir ist es so etwas wie eine Nachkontrolle.
Wenn alles normal läuft, gilt das Prinzip, der Letzte macht das Licht aus.
Ich habe aber Bereiche, die von mehreren betreten werden und niemand so wirklich weis ob er der Letzte ist.
Da ist es schon mal vorgekommen, dass alles über Nacht oder schlimmer über's Wochenende an blieb.
Gegen meine eigene Schusseligkeit, stetzte ich das BWP auch in meinem Werkzeug-/Bastelkeller ein. :roll:
Sinnvolle Möglichkeiten gibt es genug.
Grüße
-
@etv:@pix:Hallo,
ich mache das seit gut einem Jahr. Bisher werte ich die Daten nicht aus, es läuft einfach so mit.
Pro Raum werden zwei States angelegt:
<list type="lower-alpha">4. Bewegung zeigen und- Bewegung zaehlen. Die Wohnung gilt zusätzlich als ein Raum, der alle BWM einbezieht.
Bedeutung:
<list type="lower-alpha">4. Bewegung zeigen ist für VIS. Die Variable wird bei Bewegung auf true gesetzt, nach 10s wieder auf false. Somit kann ich in VIS über die Sichtbarkeit eines Widgets eine bemerkte Bewegung anzeigen lassen. Ein weiterer Taster in VIS dient zum vorzeitigen Setzen er Variable auf false (also zum Ausblenden).- Bewegung zaehlen ist ein Counter, der Pro Auslösung eins hochzählt und um Mitternacht auf 0 gesetzt wird. Für den Abluss der Badewanne wird zum Beispiel im Kinderzimmer per schedule alle 2 Minuten eins heruntergezählt. `
Servus pix,
danke für das tolle Script + Erklärung! DIe Idee mit der Anzeige auf VIS ist auch eine gute Idee.
Eine Frage hab ich noch dazu: der Schedule-Teil wird dann ja eigentlich alle zwei Minuten aufgerufen auch wenn die Variable 0 ist, oder? Wenn nein, fein - wenn ja, kann man das dann mit einem clearSchedule abfangen und wieder stoppen solange die Variable auf 0 steht?
Liebe Grüße
tom `
Hallo Tom,der Schedule Teil wird planmäßig ausgeführt, deshalb ist es ein Schedule. Wenn die Variable schon 0 ist, wird nur nichts mehr abgezogen. Ich weiss nicht, ob ein schedule oder ein Timeout mehr Ressourcen verbraucht (in diesem Fall geht es um fast gar keine Ressoucen). Aber ein Schedule ist doch leichter zu handhaben, oder nicht? Es ist nur eine Vermutung, aber wenn du wirklich deine Ressourcen minimieren willst, dann kannst natürlich auch einen anderen Schedule verwenden, der schon vom System gebaut wurde. Zum Beispiel bei jeder Abfrage des TV-Programms oder bei jeder Aktualisierung der Temperatursensoren oder oder oder.
So ist alles schön zusammen und keine Asynchronität, wenn doch mal ein Skript ausversehen aus ist. Dann klappt das nämlich alles nicht mehr. ` Man kann natürlich wieder ein anderes Skript zur Kontrolle des eigentlichen Skriptes verwenden. Ich glaube, das Skript läuft schon, wenn es mal an ist.
@Fitti:Übrigens: Machen die Homematic BWM das nicht von alleine, wenn man den richtigen Modus einstellt, oder? ` Das sehe ich auch so. Für mich ist das Badenwannen Skript dort interessant, wo nur mehrere Bewegungsmelder zusammen eindeutig eine Anwesenheit feststellen/Abwesenheit ausschließen können.
Gruß
Pix
-
Servus Pix,
danke für die Tipps. Ja es ist wie du schreibst erst sinnvoll bei mehreren Meldern - das ist bei uns im Carport der Fall…jo...Mal weiter durchdenken das Ganze. Jetzt ist es eh viiiiiieeeeelen zu kalt um die Lampen zu montieren
Liebe Grüße
tom