NEWS
Thermostate HM-CC-RT-DM in Party/Urlaubsmode setzen
-
Hallo,
um meine CCU zu entlasten versuche ich gerade die gesamte Logik von der CCU nach IO Broker zu schieben. Leider programmiere ich
eigentlich nur Perl "einigermaßen" und tue mich mit Java Script etwas schwer. Man möge mir also bitte schlechten Programmierstiel und umständliche Syntax verzeihen :oops:
Nun zum eigentlichen Problem:
Abhängig von einer Variablen (hier "FreieTage.Urlaub") sollen alle Thermostate im Haus in den Partymodus gesetzt werden.
Dafür benötige ich eine Funktion, die die Werte für das Thermostat setzt.
Hier ein Entwurf:
var urlaub=getState("javascript.0.FreieTage.Urlaub").val; log("**Urlaub="+urlaub+"**"); // nur test, abhaengigkeite von variable urlaub + schleife ueber alle thermostate erst spaeter var id="hm-rpc.0.XXXXXXXXXXX.4"; set_hv_partymode(id); function set_hv_partymode(id) { log("**ID ist:** "+id); var PARTY_START_T=getState(id+".PARTY_START_TIME").val; log("**"+id+".PARTY_START_D:** "+PARTY_START_T); // start: 1.11.2016 um 2:00 Uhr var PARTY_START_DAY = 1; var PARTY_START_MONTH = 11; var PARTY_START_YEAR = 16; var PARTY_START_TIME = 120; // ende: 5.11.2016 um 12:00 Uhr var PARTY_STOP_DAY = 5; var PARTY_STOP_MONTH = 11; var PARTY_STOP_YEAR = 16; var PARTY_STOP_TIME = 720; var PARTY_TEMPERATURE = 14; setState(id+".PARTY_START_DAY", PARTY_START_DAY, true); setState(id+".PARTY_START_MONTH", PARTY_START_MONTH, true); setState(id+".PARTY_START_DAY", PARTY_START_DAY, true); setState(id+".PARTY_START_TIME", PARTY_START_DAY, true); setState(id+".PARTY_STOP_DAY", PARTY_STOP_DAY, true); setState(id+".PARTY_STOP_MONTH", PARTY_STOP_MONTH, true); setState(id+".PARTY_STOP_DAY", PARTY_STOP_DAY, true); setState(id+".PARTY_STOP_TIME", PARTY_STOP_DAY, true); setState(id+".PARTY_TEMPERATURE", PARTY_TEMPERATURE, true); }
Leider werden die Daten für den Party/Urlaubsmode nicht übertragen bzw. nicht gesetzt. Im Event-Log sehe ich aber dass sie zumindest in IO broker gesetzt werden
Jemand eine Idee ?
-
Zum Urlaubs-/Partymode findet man nicht einmal was Erhellendes im Homematic-Forum.
Du solltest nicht Ack auf true setzen (am Ende von setState), denn das soll bei erfolgter Übertragung an das Gerät durch den hm-rpc-Adapter erfolgen.
Einfacher wäre es sicherlich mit 2 * schedule zu arbeiten und bei Reisebeginn den HKT auf MANU_MODE mit 14 °C zu setzen und bei Rückkehr wieder zurück auf AUTO_MODE.
// Urlaubsmodus steuern var id="hm-rpc.0.XXXXXXXXXXX.4"; var start = "1.11\. 2:00"; var stop = "5.11\. 12:00"; var temp = 14; start = start.split(". "); var startd = start[0].split("."); var startt = start[1].split(":"); stop = stop.split(". "); var stopd = stop[0].split("."); var stopt = stop[1].split(":"); schedule(startt[1] + " " + startt[0] + " " + startd[0] + " " + startd[1] + " *", function() { setState(id + ".MANU_MODE", temp); }); schedule(stopt[1] + " " + stopt[0] + " " + stopd[0] + " " + stopd[1] + " *", function() { setState(id + ".AUTO_MODE", true); });
-
danke Paul - das war auch meine erste Idee, hatte es aber mit dem Parameter CONTROL_MODE. versucht (Auto/Manu/Party/boost),
der ist in IO broker aber ro definiert. Wenn mann zu schnell hintereinander die Variable umschaltet, gibt es Fehler - "sending to Fast" oder so - da ist die ccu wohl nicht schnell genug..
Ein einfaches sellep oder wait kennt java script nicht - oder ?
Das Script sieht jetzt so aus - leider werden die 3 Heizgruppen, die ich habe nicht umgeschaltet. Bei Räumen ohne Heizgruppe geht es jetzt.
// // Schaltet abhaengig von der Variablen: Heizung.Heizung_aus alle Heizventile auf manuellen oder automtik Betrieb. // createState('Heizung.Heizung_aus',false, {type: 'boolean'}); var idTrigger = "javascript.0.Heizung.Heizung_aus"; var absenktemperatur = getState("hm-rega.0.5742"/*Absenktemperatur*/).val; on ({id: idTrigger, val: true}, function () { heizung_manuell() }); on ({id: idTrigger, val: false}, function () { heizung_automatisch() }); function heizung_manuell () { log('**START**'); var schalter=getState("javascript.0.Heizung.Heizung_aus").val; $('channel[state.id=*.MANU_MODE](functions=Heizung)').each(function(id,i) { log("**ID: "+id+" auf MANU_MODE "+absenktemperatur+" gesetzt**"); setState(id , absenktemperatur); }); log('Alle Ventile auf manuell gestellt'); } function heizung_automatisch () { $('channel[state.id=*.AUTO_MODE](functions=Heizung)').each(function(id,i) { log("**ID: "+id+" auf AUTO_MODE true gesetzt**"); setState(id , true); }); log('**Alle Ventile auf auto gestellt**'); }
Gru0
Olli
-
Hi ehome,
gegen das Problem mit dem zu schnell senden habe ich folgende Lösung mit setStateDelayed irgendwann mal hier im Forum gefunden. Ich benutze es zum Beispiel um alle Lichter auszuschalten …
var idx = 0; /* Index-Zähler */ var interval = 300; /* 300ms Abstand */ $('channel[state.id=*.STATE](functions=Beleuchtung)').each(function (id, i) { var obj = getObject(id); if (getState(id).val){ setStateDelayed(id, false, (idx++) * interval); /* Zähler erhöhen, mit Interval multipliziert */ log('switch off: ' + obj.common.name); } });
Habe noch etwas gefunden wegen dem Party-Mode im https://forum.homegear.eu/viewtopic.php?t=115#p736
` > Es macht gegenüber den einzelnen Party-Mode-Variablen auf jeden Fall Sinn, PARTY_MODE_SUBMIT zu verwenden, weil dann nur ein einziges Paket an den Stellantrieb gesendet werden muss.An PARTY_MODE_SUBMIT übergibst du einen String mit folgenden kommagetrennten Elementen:
Partytemperatur (z. B. 21.5 - nicht mit Komma schreiben)
Start-Uhrzeit in Minuten seit 0 Uhr mit einer Auflösung von 30 Minuten (also zum Beispiel 1020 für 17 Uhr)
Starttag (z. B. 21)
Startmonat (z. B. 5)
Letzte zwei Ziffern des Startjahres (z. B. 14 für 2014)
End-Uhrzeit in Minuten seit 0 Uhr wieder mit einer Auflösung von 30 Minuten (z. B. 1380 für 23 Uhr)
Endtag
Endmonat
Letzte zwei Ziffern des Endjahres `
Gruß
Philippe