NEWS
Einschaltdauer
-
Bei jedem Schalter gibt es ja on-time, welche ich über ein Skript auf 600 setze, also 600 Sekunden.
Nach 600 Sekunden schaltet das Licht auch wieder aus, soweit so gut.
Ich möchte aber nun wissen wie lange dass Licht schon an ist,bzw. wie lange das Licht noch leuchtet von den 600 Sekunden.
Ist dass auch gespeichert und kann ich das Abrufen? Oder müsste ich dies errechnen?
Sprich beim Skript automatisch einen Zähler setzten, welcher dann von 600 im Sekundentakt runterzählt.
212_schalter_1.jpg -
-
Danke Paul…dachte es mir schon aber fragen koststet ja nichts
-
Hallo,
falls es für Dich oder jemand anderen noch Interessant ist.
So habe ich es gelöst:
! ````
createState('BadFensterLinksZaehler.Tag', 0, {read: true, write: true, type: 'number', name: "Bad Fenster Links"});
createState('BadFensterLinksOffen.Tag', 0, {read: true, write: true, type: 'number', name: "Bad Fenster Links Offen"});
createState('HaustuerZaehler.Tag', 0, {read: true, write: true, type: 'number', name: "Haustuer"});
createState('HaustuerOffen.Tag', 0, {read: true, write: true, type: 'number', name: "Haustuer Offen"});var BadFensterLinks = "hm-rpc.0.DeineID.1.STATE"; // Bad Drehgriff Fenster links:1.STAT
var BadFensterLinksOffen = "javascript.0.BadFensterLinksOffen.Tag"; // Bad Fenster LinksOffen
var Haustuer = "hm-rpc.0.DeineID.1.STATE"; // Haustuer:1.STATE
var HaustuerOffen = "javascript.0.HaustuerOffen.Tag"; // Haustuer Offen! on ({id: BadFensterLinks, val: 1}, fBadFensterLinksAuf);
on ({id: BadFensterLinks, val: 2}, fBadFensterLinksAuf);
on ({id: Haustuer, change: "gt"}, fHaustuer);
on ({id: HaustuerOffen, change: "any"}, fHaustuerOffen);
! function fBadFensterLinksAuf (){
setState("javascript.0.BadFensterLinksZaehler.Tag", ++getState("javascript.0.BadFensterLinksZaehler.Tag").val);
newvalue = Number(getState("javascript.0.BadFensterLinksOffen.Tag").val);
newvalue = newvalue + 0.01;
newvalue = newvalue.toFixed(2);
setState("javascript.0.BadFensterLinksOffen.Tag", newvalue);
}
! function fBadFensterLinksOffen (){
if (getState(BadFensterLinks).val !== 0){
newvalue = Number(getState("javascript.0.BadFensterLinksOffen.Tag").val);
newvalue = newvalue + 0.10;
newvalue = newvalue.toFixed(2); // subtraktion beider Werte
setStateDelayed ("javascript.0.BadFensterLinksOffen.Tag", newvalue, 6000);
}
}
! function fHaustuer (){
setState("javascript.0.HaustuerZaehler.Tag", ++getState("javascript.0.HaustuerZaehler.Tag").val);
newvalue = Number(getState("javascript.0.HaustuerOffen.Tag").val);
newvalue = newvalue + 0.01;
newvalue = newvalue.toFixed(2);
setState("javascript.0.HaustuerOffen.Tag", newvalue);
}
! function fHaustuerOffen(){
if (getState(Haustuer).val === true){
newvalue = Number(getState("javascript.0.HaustuerOffen.Tag").val);
newvalue = newvalue + 0.10;
newvalue = newvalue.toFixed(2);
setStateDelayed ("javascript.0.HaustuerOffen.Tag", newvalue, 6000);
}
}
! ````
So in der Art habe ich es auch schon direkt auf der CCU2 gelöst.Bad ist eine Drehriffkontakt von Homematic (Zustand 0, 1 , 3 je nach dem ob zu offen oder gekippt)
Haustür ein Funk Fenster Kontakt Magnetkontakt von Homematic (true, false Zustand)
Die eine Variable zählt die Anzahl der Öffnungen.
Die andere ca. die Zeit (Nicht hundertprozentig, aber ich denke für die meisten Anwendungen sollte es reichen.
Löst ein Kontakt aus, greift durch das hochzählen der Variable die zweite Funktion z.B. fHaustuerOffen
Ach ja nicht vergessen den Zähler nachts wieder zu reseten :shock:
!
schedule("0 0 * * *", function () { log('Schedule Aktion Tuer Fenster Kontakte Zaehler reset 00:00 Uhr'); setState("javascript.0.BadFensterLinksZaehler.Tag", 0); setState("javascript.0.BadFensterLinksOffen.Tag", 0); setState("javascript.0.HaustuerZaehler.Tag", 0); setState("javascript.0.HaustuerOffen.Tag", 0); }); !
Das ganze kann bestimmt durch globale Funktionen noch weiter zusammengefasst werden, da ich aber Blutiger Anfänger / Hobbyprogrammierer bin,löse ich es oftmals nach dem KIS (KEEP IT SIMPLE) Prinzip :lol: :lol: :lol:
Gruß
Phantomio
-
Hallo Phantomio,
interessanter Ansatz, die Zeit zu messen: Beim Öffnen der Tür wird nach 6s ein Dezimalzähler um 0.1 erhöht. Die Erhöhung startet die Subscription neu und nach 6s wird wieder erhöht, usw. So kommst du auf 10s genaue Werte und die Last hält sich in Grenzen.
Benutze im Skript mehr idVariablen. Du hast sie ja oben schon angelegt, dann solltest du sie unten auch verwenden
var BadFensterLinks = "hm-rpc.0.DeineID.1.STATE"; // Bad Drehgriff Fenster links:1.STAT var BadFensterLinksOffen = "javascript.0.BadFensterLinksOffen.Tag"; // Bad Fenster LinksOffen var BadFensterLinksZaehler = "javascript.0.BadFensterLinksZaehler.Tag" // Bad Fenster Links Zähler (Tag) var Haustuer = "hm-rpc.0.DeineID.1.STATE"; // Haustuer:1.STATE var HaustuerOffen = "javascript.0.HaustuerOffen.Tag"; // Haustuer Offen
und unten dann
function fBadFensterLinksAuf (){ setState(BadFensterLinksZaehler, ++getState(BadFensterLinksZaehler).val); newvalue = Number(getState(BadFensterLinksOffen).val); newvalue = newvalue + 0.01; newvalue = newvalue.toFixed(2); setState(BadFensterLinksOffen", newvalue); } ... ````So kannst du später leichter neue Objekte einbauen oder die Struktur deiner Objekte ändern ohne groß am Skript zu basteln. Gruß Pix PS:
on ({id: BadFensterLinks, val: 1}, fBadFensterLinksAuf);
on ({id: BadFensterLinks, val: 2}, fBadFensterLinksAuf);on ({id: BadFensterLinks, valGe: 1}, fBadFensterLinksAuf); // größer oder gleich 1
-
Hey Pix,
danke für die Tipps
Ich bin für jeden Tipp dankbar.
Gerade wenn diese einem das Leben langfristig erleichtern.
Werde meine Scripte demnächst mal umbauen.
Gruß
Phantomio