NEWS
[gelöst] Anwesenheitskontrolle über WLan zur Comet Dect Ansteuerung an FritzBox 6490
-
Moin,
Ist nicht unverschämt aber bei JavaScript kann ich dir leider nicht helfen.
Meine mich erinnern zu können das es hier im Forum aber ein fertiges Script gibt für Anwesenheitskontrolle.
Schau mal ob hier etwas dabei ist:
http://forum.iobroker.net/search.php?st … t&start=20
Gesendet von iPhone mit Tapatalk Pro
-
Noch eine Frage falls das nicht unverschämt ist:
Meinst du das funktioniert so?
var schedule, schedule2; schedule = schedule('*/5 * * * *', function () { on({id: "tr-064.0.devices.Galaxy-S6-edge.active"/*active*/, val: true}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; setState("fritzdect.0.Comet_119600101272.targettemp"/*Target Temp*/, getState("fritzdect.0.Comet_119600101272.comfytemp").val); }); }); schedule2 = schedule('*/5 * * * *', function () { on({id: "tr-064.0.devices.Galaxy-S6-edge.active"/*active*/, val: false}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; setState("fritzdect.0.Comet_119600101272.targettemp"/*Target Temp*/, 'fritzdect.0.Comet_119600101272.nighttemp'); }); }); ```` `
schedule ist in sich ein trigger (hier alle 5 Minuten). Ein "on" Befehl wird da nicht gebraucht. Wenn du das über einen schedule lösen willst, reicht eine if Abfrage.
Diese Teile
var value = obj.state.val; var oldValue = obj.oldState.val; ````brauchst du gar nicht, das ist nur immer von Blockly erzeugt (stimmts?) Auch den doppelten Schdule brauchst du nicht, denn es gibt ja if else Anweisungen. Ebensowenig braucht es die Variablen "schedule und schedule2". Wozu die dienen sollen in deinem Skript ist mehr eh unklar, was war der Kerngedanke? Die Frage wäre, was willst du wirklich? Wenn dein Handy da ist, soll die Temperatur auf "comfy" gestellt werden, sonst auf "night"? Sofern dein Handy in den Deep Sleep geht, könnte das auch tagsüber zum ständigen hin und her führen Mit schedule sähe das so aus (ungetestet, ich gehe davon aus, dass die Anwesenheit im TR64 Adapter true/false liefert):
var idAnwesenheit = "tr-064.0.devices.Galaxy-S6-edge.active"/active/; // das herausnehmen bzw voranstellen von "Zielobjekten" macht den eigentlichen Quellcode einfacher lesbar udn erlaubt schnelle Anpassungen
var idTarget = "fritzdect.0.Comet_119600101272.targettemp"/Target Temp/;
var idComfy = "fritzdect.0.Comet_119600101272.comfytemp";
var idNight = "fritzdect.0.Comet_119600101272.nighttemp";schedule('*/5 * * * *', function () {
if( getState(idAnwesenheit).val) // ein "Zielergebnis" muss nicht explizit genannt werden, denn if(xy) testet xy auf truesetState(idTarget, getState(idComfy).val); // bei nur einer Folgeaktion müssen keine {} gesetzt werden
else
setState(idTarget, getState(idNight).val);
});
Man könnte das ganze noch kürzer schreiben, aber ich lasse es mal so zwecks Nachvollziehbarkeit.
-
Wow! Ich danke dir.
Mit Blockly hast du klar richtig geraten. Aber ich habe wirklich kaum Ahnung von Javascript und bin schon heilfroh wenn ich irgendeine Funktion schalten kann.
Ob es sich in meinem Alter noch lohnt komplett Java zu lernen wage ich zu bezweifeln, aber mit dem Blockly funktioniert es so ungefähr wie es soll.
Ich finde es dann richtig Toll wenn sich Leute wie du hinsetzen und mal eben so locker das Script richtigstellen - RESPEKT - und herzlichen Dank!
Edit:
Was ich damit will? Fast richtig: Wenn mein Junior da ist darf die Heizung auf Comfy und (später) soll dann auch das Licht ausgeschaltet werden wenn er es (wie üblich) vergessen hat.
-
eventuell ist es dann sinniger, mit einer on funktion zu arbeiten statt mit schedule.
Und wie ist es mit einer Zeitberücksichtigung? Wäre ja sinnig, wenn z.B. die Heizung ab z.B. 22h grundsätzlich auf night eingestellt wird, oder?
-
Oh, da hast du mich jetzt voll erwischt.
Ich habe ja in meiner blöden Idee glatt die Nachtabsenkung vergessen.
Wie schreibt man da ein Zeitfenster rein?
Wie kann ich eine On-Funktion verstehen?
Ich habe mir da aus deinem Code und den Fragmenten aus Blockly was zusammengestrickt:
var idAnwesenheit = "tr-064.0.devices.Galaxy-S6-edge.active"/*active*/; // das herausnehmen bzw voranstellen von "Zielobjekten" macht den eigentlichen Quellcode einfacher lesbar udn erlaubt schnelle Anpassungen var idTarget = "fritzdect.0.Comet_119600101272.targettemp"/*Target Temp*/; var idComfy = "fritzdect.0.Comet_119600101272.comfytemp"; var idNight = "fritzdect.0.Comet_119600101272.nighttemp"; schedule = schedule(compareTime('05:45', '22:00', "between", null), function () { schedule('*/5 * * * *', function () { if( getState(idAnwesenheit).val) // ein "Zielergebnis" muss nicht explizit genannt werden, denn if(xy) testet xy auf true setState(idTarget, getState(idComfy).val); // bei nur einer Folgeaktion müssen keine {} gesetzt werden else setState(idTarget, getState(idNight).val); }); });
Kann das stimmen?
-
Hallo,
Javascript arbeitet mit sogenannten triggern / Auslösern.
Die können eben ein Schedule sein, der alle x Minuten ausgeführt wird oder auch eine Änderung eines Zustands, auf den gelauscht wird.
Wenn Zustand geändert –> tue, was in der Funktion steht. Das wäre die "on" function.
Für deine Zwecke reicht das bzw ist geeigneter, denn du musst ja nicht alle 5 Minuten prüfen, ob dein Junior da ist sondern willst, dass wenn er da ist, die Heizung angepasst wird und ebenso, wenn er weggeht.
Skript passe ich dir morgen gerne an
-
Ah, so funktioniert das also.
Ok, dann habe ich noch ein kleines Problem. Das wird vermutlich bei schedule bleiben müssen, weil die Thermostate alle 15 Minuten in ihre ursprüngliche Programmierung zurückfallen. Somit muss ich scheinbar den Wert immer neu einschreiben.
Kann ich eigentlich den Wert auch auf eine Solltemperatur ändern?
Ich denke das ich in der Wohnung ebenso absenken werde, aber dort will ich nicht auf ganze Nachtabsenkung runter sondern nur auf 20°C (ja, ja, die Frauen)
Das habe ich eventuell so gebastelt:
var idAnwesenheit = "tr-064.0.devices.XXXXXX-S6-edge.active"/*active*/; var idAnwesenheit = "id:tr-064.0.devices.XXXXXP8.active"/*active*/; var idAnwesenheit = "id:tr-064.0.devices.XXXXXXMobil.active"/*active*/; var idTarget = "fritzdect.0.Comet_119600XXX280.targettemp"/*Target Temp*/; //Wohnzimmer var idComfy = "fritzdect.0.Comet_119600XXX280.comfytemp"; var idNight = "fritzdect.0.Comet_119600XXX280.nighttemp"; var idLow = "20"; schedule = schedule(compareTime('05:45', '22:00', "between", null), function () { schedule('*/5 * * * *', function () { if( getState(idAnwesenheit).val) // ein "Zielergebnis" muss nicht explizit genannt werden, denn if(xy) testet xy auf true setState(idTarget, getState(idComfy).val); // bei nur einer Folgeaktion müssen keine {} gesetzt werden else setState(idTarget, 20 ); }); });
-
Hallo Chaot,
eventuell schreibst du mir nochmal genau, worum es geht:
sind es zwei Wohnungen? Oder eine? Das ist mir gerade nicht klar.
Du hast Thermostaten, die grundsätzlich in einem definierten "auto" Modus laufen, richtig? Die sind von AVM? Die kenne ich nicht.
Anstatt alle 5 Minuten ggf. den auto Modus zu überschreiben kann man den bestimmt durch manuellen Modus ersetzen, und dann z.B. ab 22:45h auf Auto stellen.
Dazu müsste ich mal einen Screenshot der States eines Thermostaten sehen.
Schreib mir gerne nochmal Stück für Stück auf, was wie laufen soll (mit welchen Personen, soll es je nach Person anders reagieren? Wenn ja, überschreibt z.B. Anwesenheit der Ehefrau die Anwesenheit des Juniors (falls Junior auch ein paar Grad kälter verträgt, als die holde Maid?)). Aktuell hast du jetzt ja drei Anwesenheiten definiert (nehme an du, Ehefrau, Kind); soll es egal sein, wer da ist hinsichtlich Temperatur, oder unterscheidet sich das?
Mit dem Skripten kann ich dir gerne helfen, allerdings bin ich kein "Heizungsguru", denn bei uns läuft die FBH einfach über die die Einstellungen am Boiler, ich passe also nicht dauernd an.
Dein Code hat ein paar Fehler; die kann ich aber leider nicht komplett bereinigen, solange ich nicht weiß, was genau du möchtest, siehe meine Fragen oben.
Ich schreibe dir aber als Kommentar mal ein paar Hinweise in den Code.
*/ Hinweis 1: du hast dreimal die gleiche Variable (Nummern habe ich nun hinzugefügt) und hast ihr drei Werte zugewiesen. Damit wäre idAnweseheit immer nur bezogen auf XXXXXMobil, als letztem zugewiesenen Wert. Daher habe ich drei Variablen draus gemacht */ var idAnwesenheit1 = "tr-064.0.devices.XXXXXX-S6-edge.active"/*active*/; var idAnwesenheit2 = "id:tr-064.0.devices.XXXXXP8.active"/*active*/; var idAnwesenheit3 = "id:tr-064.0.devices.XXXXXXMobil.active"/*active*/; var idTarget = "fritzdect.0.Comet_119600XXX280.targettemp"/*Target Temp*/; //Wohnzimmer var idComfy = "fritzdect.0.Comet_119600XXX280.comfytemp"; var idNight = "fritzdect.0.Comet_119600XXX280.nighttemp"; var idLow = 20; // Anführungszeichen bedeuten String, wahrscheinlich funktioniert das auch, ein Integer sollte aber passender sein schedule('*/5 * * * *', function () { if( ((getState(idAnwesenheit1).val || getState(idAnwesenheit2).val || getState(idAnwesenheit3).val )) && compareTime('05:45', 22:00', 'between') ) // wenn mindestens einer von euch da ist und es zwischen den Uhrzeiten ist, dann..... setState(idTarget, getState(idComfy).val); // bei nur einer Folgeaktion müssen keine {} gesetzt werden else setState(idTarget, idLow); }); });
-
Ah! Danke schön. Das mit den 3 Variablen ist mir zwar aufgefallen, aber ich hatte keine Idee zur Lösung.
Tatsächlich handelt es sich in meinen Beiträgen um 2 verschiedene Thermostate bzw. Räume.
oben habe ich versucht noch ein Zeitfenster einzugeben in dem der Thermostat per script gesteuert wird.
In dem zweiten Block wird ein anderer Raum gesteuert. Das ist unser Wohnraum (ähnl. Loft). Dort soll die Heizung bei Anwesenheit von einem der 3 Telefone gesteuert werden.
Da habe ich ebenfalls versucht ein Zeitfenster zu schreiben````
schedule = schedule(compareTime('05:45', '22:00', "between", null), function ()aber scheinbar hast du das als Fehlerhaft erkannt und rausgeworfen. (Danke schön). Zu deinen Fragen: Es handelt sich um eine Wohnung mit 2 Thermostaten die gesteuertwerden sollen. Es gibt zwar noch weitere Räume, aber die können auf der "groben" Grundsteuerung bleiben. Dabei handelt es sich um Comet DECT Thermostate [https://www.amazon.de/gp/product/B00TA5 … UTF8&psc=1](https://www.amazon.de/gp/product/B00TA5DF2Q/ref=oh_aui_search_detailpage?ie=UTF8&psc=1) die an einer Fritzbox angeschlossen sind. Die Box ist eine Kabeldeutschland 6490 auf der es nicht möglich ist andere Firmware aufzuspielen. Ich habe bisher noch keine Möglichkeit gefunden die Thermostate über die Box auf einen manuellen Modus zu schalten. Es ist zwar möglich am Thermostat manuell eine Temperatur einzustellen. Diese wird aber nach spätestens 15 Minuten wieder mit der Solltemperatur überschrieben. In der Fritzbox ist grundsätzlich nur die Zeitsteuerung vorgesehen. Bei der Anwesenheit Junior soll ein Thermostat im Zimmer und der Wohnraum geschaltet werden. Bei Anwesenheit der beiden anderen Telefone soll dann nur der Wohnraum geschaltet werden. Allerdings dauert es recht lange den Wohnraum auf die Komforttemperatur zu bringen wenn er auf Nachtabsenkung war. von daher dachte ich das es reichen würde den Thermostat nur auf 19 oder20 Grad abzusenken [5779_dect1.jpg](/assets/uploads/files/5779_dect1.jpg)
-
Ich habe das script von dir ausprobiert. Irgendwie zeigt der mir den Bereich hier als Fehlerhaft an:
schedule('*/5 * * * *', function () { if( ((getState(idAnwesenheit1).val || getState(idAnwesenheit2).val || getState(idAnwesenheit3).val )) && compareTime('05:45', 22:00', 'between') ) // wenn mindestens einer von euch da ist und es zwischen den Uhrzeiten ist, dann..... setState(idTarget, getState(idComfy).val); // bei nur einer Folgeaktion müssen keine {} gesetzt werden else setState(idTarget, idLow); }); });
Ich kann aber nicht erkennen was da falsch sein sollte.
-
Ich denke mal ich hab's:
var idAnwesenheit1 = "tr-064.0.devices.Galaxy-S6-edge.active"/*active*/; var idAnwesenheit2 = "id:tr-064.0.devices.G***-P8.active"/*active*/; var idAnwesenheit3 = "id:tr-064.0.devices.B****Mobil.active"/*active*/; var idTarget = "fritzdect.0.Comet_1196****8280.targettemp"/*Target Temp*/; //Wohnzimmer var idComfy = "fritzdect.0.Comet_1196****8280.comfytemp"; var idNight = "fritzdect.0.Comet_1196****8280.nighttemp"; var idLow = "20"; schedule('*/5 * * * *', function () { if( ((getState(idAnwesenheit1).val || getState(idAnwesenheit2).val || getState(idAnwesenheit3).val )) && compareTime('05:45', '22:00', "between", null) ) setState(idTarget, getState(idComfy).val); else setState(idTarget, idLow); });
Zumindest läuft so das script ohne meckern.
Morgen werde ich mal die Telefone aus dem Netz nehmen und sehen was passiert.
-
oh,
ja da hatte ich wohl ein }); gedoppelt ausversehen. Sowas passiert mir dauernd, wenn ich sachen nur im Forum tippe…
Lass hören, ob es geht.
-
Soweit ich sehe scheint das bisher zu funktionieren.
Zumindest sehe ich im Log das die SetTemp an die Thermostate gehen und das das Thermostat die Temperatur entsprechend setzt.
Ich danke dir nochmals für deine Hilfe.
Mal sehen ob ich jetzt meine Aquariumbeleuchtung von der seltsamen "Energenie" Steckdosenleiste nehme und die durch Sonoff S20 ersetze. Das finde ich komfortabler und sicherer (Die Verarbeitung der Leiste ist furchtbar). Aber da werden nur 3 Zeitschaltungen eingesetzt die recht einfach zu machen sein sollten.
Dank deiner Hilfe traue ich mir das jetzt zu so langsam auf die Reihe zu kriegen und mich doch etwas in die Scriptsprache einzuarbeiten.
Übrigens: Der ursprüngliche Fehler in deinem Script war ein vergessenes " ' " vor der 22:00 Uhr Einstellung.
-
Dank der Hilfe von tempestas hier noch der Vollständigkeit halber die funktionierenden Scripte:
Für einen Raum:
var idAnwesenheit1 = "tr-064.0.devices.Telefon1.active"/*active*/; var idTarget = "fritzdect.0.Comet_119600001272.targettemp"/*Target Temp*/; var idComfy = "fritzdect.0.Comet_119600001272.comfytemp"; var idNight = "fritzdect.0.Comet_119600001272.nighttemp"; schedule('*/5 * * * *', function () { if( (getState(idAnwesenheit1).val) && compareTime('05:45', '22:00', "between", null) ) setState(idTarget, getState(idComfy).val); else setState(idTarget, getState(idNight).val); });
Mit 3 Überwachten Telefonen:
` > var idAnwesenheit1 = "tr-064.0.devices.Telefon1.active"/active/;
var idAnwesenheit2 = "tr-064.0.devices.Telefon2.active"/active/;
var idAnwesenheit3 = "tr-064.0.devices.Telefon3.active"/active/;
var idTarget = "fritzdect.0.Comet_119600008280.targettemp"/Target Temp/; //Wohnzimmer
var idComfy = "fritzdect.0.Comet_119600008280.comfytemp";
var idNight = "fritzdect.0.Comet_119600008280.nighttemp";
schedule('*/5 * * * *', function () {
if( ((getState(idAnwesenheit1).val || getState(idAnwesenheit2).val || getState(idAnwesenheit3).val )) && compareTime('05:45', '22:00', "between", null) )
setState(idTarget, getState(idComfy).val);
else
setState(idTarget, getState(idNight).val);
}); `
Nochmals meinen ausdrücklichen Dank an tempestas der mich sehr weit bei dieser Anwesenheitskontrolle unterstützt hat.
-
@Chaot Ich habe gerade gelesen. Das du auch eine Energenie Steckdose besitzt. Hast du die in iob integrieren können. Ich habe bis jetzt das überhaupt noch nicht hinbekommen.
-
@Basti97 Ich habe die komische Steckdose schon vor längerer Zeit entfernt. Die hat auch über USB nie so richtig funktioniert wie ich das wollte.
Aktuell habe ich mir für das Aquarium aus einem Brüstungskanal, mehreren Relais und einem WemosD1 mini eine eigene Steckdosenleiste gebaut.
Der Wemos betätigt dabei die Steckdosen einzeln:
Heizung
Licht Tag
Licht Mondschein
Belüftung
und zusätzlich ohne Relais die Pumpe.
Außerdem hängen am Wemos noch zwei Temperatursensoren für Wasser und Pumpentemperatur.
Geschaltet wird dann über Scripte im ioBroker.Das zweite Aquarium habe ich gleich bei der Einrichtung auf 12V umgebaut und dort alles nur mit Wemos und SonoffSV gesteuert. Da sind gar keine Steckdosen mehr im Einsatz.
-
@Chaot Danke ich habe die Lan Steckdose und bekomme diese auch nicht in iob. Das komische an der Steckdose ist, dass diese ohne Netzwerkanschluss überhaupt nicht funktioniert. Der behält nicht mal seine eigene Uhrzeit da er über einen Server die Uhrzeit immer abrufen will. Sobald man den Haken heraus macht kann man nur ein Datum bis 2010 einstellen.
Damals war das meine erste Steckdose die ich hatte. Wenn ich das gewusst hätte
dann hätte ich sie nicht gekauft.
Deine Lösung muss ich mir mal genauer ansehen das klingt interessant. Hast du eine fertige Relaismodul benutzt? -
@Chaot Hast du eine "richtige Tageslichtsimulation" für das Aquarium gebaut bzw programmiert. Das wäre auch noch ein Traum für mich.
-
@Basti97 Tageslichtsimulation habe ich noch nicht. Das werde ich mir mal in Ruhe zusammenkleben. Ich denke da an WS2812 die dann über den WLed Adapter gesteuert werden.
https://github.com/iobroker-community-adapters/ioBroker.wled/blob/master/README.md
https://github.com/Aircoookie/WLED
Aber das ist ein Projekt das ich in aller Ruhe umsetzen möchte um es so realitätsnah wie möglich zu schaffen.
Vorstufe habe ich beim Aquarium 2 angefangen. Dort ist die Tageslichbeleuchtung aus 6 x 1 m LED Stripes erstellt die einzeln geschaltet werden.Ob du fertige Relaismodule verwendest hängt hauptsächlich von deinen handwerklichen Fähigkeiten ab. Ich habe das Löten gelernt und habe mir deshalb einzelne Relais gekauft die ich dann einzeln verlötet habe.
Nochmals würde ich diese Steckdosenleistenlösung allerdings nicht mehr so umsetzen. Das zweite Aquarium kann ich wesentlich genauer steuern und es ist auch kein sonderlicher Mehraufwand.
Da ich die Preise von fertigen Lichtbalken schlicht unverschämt finde baue ich mir meine Beleuchtung eben selbst. Vorzugsweise mit Bauteilen aus dem großen Land. -
@Chaot Genau ganz besonders die Lichtbalken von Juwel die sind ganz schön teuer. Ich plane die Lichtleisten mit RGB SMD Leds verscheinlich die 10W Chips. Zusätzlich mit weißen und blauen Leds als Tagesbeleuchtung und Nacht/ bzw Mondlicht.
Die ganzen anderen (außer Temperatur, Helligkeit, Futterautomat, Co2 Sensor, Erschütterungssensor gehen über ein ESP) alles andere über eine Logo8.Hast du Wled auch noch wo anders in benutz?
Mir fehlen die Inspirationen für die bis wie ich diese aufbauen kann.