NEWS
Balkontür länger geöffnet
-
Hallo,
ich habe meine Xiaomi Fensterkontakte mit meinen Homematic Heizungsthermostaten verknüpft. Fenster auf... Temperatur runter.... Fenster zu... Temperatur wieder hoch.
Leider kommt es ab und an mal vor, dass die Temperatur beim schließen nicht wieder hoch geht.
Ich möchte jetzt, dass wenn das Fenster längere Zeit auf offen steht, die Temperatur wieder hoch geht. -
@lustig29 und wie hast du das bisher umgesetz? Script? Im iobroker oder in homematic?
Ich hatte so ein ähnliches Problem, dass die Temperatur nach einer gewissen Zeit wieder hochgeht obwohl Fenster noch auf war. Das lag aber an Homematic Logik...Also poste mal deine Lösung/deine Scripte dann kann man mal schauen
-
-
@lustig29 Hm, sieht eigentlich richtig aus, ich geh mal davon aus, dass deine Merkervariablen alle eindeutig sind, also wirklich eine pro Raum.
Bau doch in das Skript mal ein paar debug Anweisungen ein, damit du im logfile nachlesen kannst ob ein Schliessen überhaupt erkannt wurde und welchen Wert Merker_Temperatur_xxxx da hat.Arbeitest du mit Alias? Bei mir heisst der Datenpunkt vom HM Thermostat anders, SetPointTemperature kenne ich gar nicht:
hm-rpc.0.LEQxxxxxxx.4.SET_TEMPERATURE -
Hi @amg_666,
ich habe das selbe Prob: Ist ein Fenster lange auf, stellt der Thermostat wieder die hohe Temperatur ein und heizt damit die Umwelt.
Komischerweise zeigt der Thermostat DENNOCH das Fenstersymbol an. Ich denke daher, dass es nicht an meiner Script-Logik hängt. Der Support von Homatic will damit natürlich nichts zu tun haben, da ich IoBroker einsetze...
Was war denn bei dir der Fehler?
VG,
AndyMein Jave-Script kann ich gerne hier rein packen:
const myRooms = getEnums("rooms"); // iterate through all sensors of a room and check, if any window/door is open // returns true, if any window is open, false if all windows are closed: function isAnyWindowInRoomOpen(str_roomName) { let anyInRoomOpen = false; $('channel[state.id=opened](rooms=' + str_roomName + ')(functions=funcSecurity)').each(function(id) { let myObj = getObject(id); let singleSensorState = getState(id); myLog(1, "isAnyWindowInRoomOpen():: " + myObj.common.name + " is " + singleSensorState.val); anyInRoomOpen = anyInRoomOpen || singleSensorState.val; }); myLog(2, "isAnyWindowInRoomOpen(): " + str_roomName + " has an open window? " + anyInRoomOpen); return anyInRoomOpen; } // creates state variables for each room if a window is open function setupStates() { let anyInFlatOpen = false; for( let myRoom of myRooms) { let myRoomName = myRoom.id.split(".")[2]; let anyInRoomOpen = isAnyWindowInRoomOpen(myRoomName); anyInFlatOpen = anyInFlatOpen || anyInRoomOpen; myLog(3, "setupStates():: Initializing room " + myRoomName + ".anyWindowOpen to: " + anyInRoomOpen); createState('roomstates.' + myRoomName + '.anyWindowOpen', anyInRoomOpen, true, { read: true, write: true, name: 'Ist ein Fenster geöffnet', desc: 'Ist ein Fenster geöffnet', type: 'boolean' }); } myLog(3, "setupStates(): Initializing flatWindowOpen to: " + anyInFlatOpen); createState("flatWindowOpen", anyInFlatOpen, true, { read: true, write: true, name: "Is true, if any window or door in appartment is open", type: "boolean", def: false }); } // subscribe to all contact sensor changes and set a timer if something changes: function setupWindowSubscriptions() { $('[state.id=opened](functions=funcSecurity)').on(function (obj) { myLog(1, "setupWindowSubscriptions(): Contact " + obj.common.name + " changed to: " + obj.state.val); // reconstruct sensor ID let strArr_splittedId = obj.id.split("."); let uri_sensorId = strArr_splittedId[0] + "." + strArr_splittedId[1] + "." + strArr_splittedId[2]; let obj_sensor = getObject(uri_sensorId); setTimeout(reCheckState, shortTimeOpen, uri_sensorId, obj.state.val); }); } // triggered short time after window state changes to see, if change is still present // if so, toggle the state of the whole room function reCheckState(uri_sensorId, bool_stateToCheck) { let sensorState = getState(uri_sensorId + ".opened"); //whatIs("checkStillOpen: sensorState = ", sensorState); if(sensorState.val == bool_stateToCheck) { myLog(2, "reCheckState: State unchanged after " + (shortTimeOpen / 1000) + " seconds."); let obj_room = whichRoom(uri_sensorId); let str_roomName = obj_room.enumIds[0].split(".")[2]; let bool_roomState = isAnyWindowInRoomOpen(str_roomName); setState('javascript.0.roomstates.' + str_roomName + '.anyWindowOpen', bool_roomState); } else { myLog(2 ,"reCheckState: State changed within " + (shortTimeOpen / 1000) + " seconds. Ignoring."); } } function whichRoom(obj) { let dp = getObject(obj,"rooms"); //myLog("room fct: devname = " + obj + " dp " + dp.enumIds[0]); return dp; } // monitors if a room's "any window is open" state changed: function setupRoomStateSubscriptions() { // this only triggers if new state != oldState so it ignores false positives. // and only sends triggers to the heating, if necessary: $('[state.id=anyWindowOpen]').on(function (obj) { reactOnRoomStateChange(obj.id.split(".")[3], obj.state.val); }); //perhaps use $ but define any "true" state as trigger. } function reactOnRoomStateChange(room, isAnyWindowOpen) { myLog(2, "reactOnRoomStateChange(): A window in room " + room + " changed its state. Any window is open? " + isAnyWindowOpen); let windowInAppartmentOpen = false; for( let myRoom of myRooms) { let myRoomName = myRoom.id.split(".")[2]; let status = getState('roomstates.' + myRoomName + '.anyWindowOpen').val; myLog(1, "reactOnRoomStateChange():: Status of single room " + myRoomName + " is " + status); windowInAppartmentOpen = windowInAppartmentOpen || status; } myLog(3, "reactOnRoomStateChange(): Set flatWindowOpen to: " + windowInAppartmentOpen); setState("javascript.0.flatWindowOpen", windowInAppartmentOpen); } setupStates(); setupWindowSubscriptions(); setupRoomStateSubscriptions();
-
@Squelsh Ne, bei mir war es ein simpler Logik-Fehler: Ich steuere meine (Homematic-) Thermostaten über ein Homematic Script und ich hatte da einfach einen logischen Fehler drin: Das Script läuft alle 20 Minuten und hat nicht geprüft ob ein Fenster offen ist. Effekt: Ich öffne z.B. im Bad ein Fenster, dann regelt der Bad-Heizkörper runter. Und nach spätestens 20 Minuten bügelt das Script da drüber und stellt die geplante Temperatur wieder ein.
Eine Idee habe ich nicht, was bei dir der Fehler sein könnte. Stehen die Thermostate auf "Manu Modus" oder auf "Auto Modus"? Wenn du in HM was mit Skripten "manipulieren" willst, dann sollten die Device auf "Manu" stehen, da hatte ich mal ein Problem, weiss aber nicht ob dir das weiterhilft...
-
@lustig29
Wie sieht denn dein Hauptprogramm aus, mit dem du die Thermostate auf die Heiztemperatur setzt? -
@Squelsh Bei mir ist ja das Problem, das bei geöffneter und dann wieder geschlossener Tür die 12 Grad (Fenster offen Temperatur) stehen bleiben und nicht die zuvor eingestellte Raumtemperatur.
-
Danke @amg_666! Bisher stelle ich sie nicht auf Manuell um. Das teste ich auf jeden Fall mal.
-
Sorry @Ocrim, hatte das falsche Script gepostet. Das was da ist, setzt ein Flag pro Zimmer.
Und dieses Script hier reagiert darauf:// monitors if a room's "any window is open" state changed: function setupRoomStateSubscriptions() { // this only triggers if new state != oldState so it ignores false positives. // and only sends triggers to the heating, if necessary: $('[state.id=anyWindowOpen]').on(function (obj) { reactOnRoomStateChange(obj.id.split(".")[3], obj.state.val); }); //perhaps use $ but define any "true" state as trigger. } function reactOnRoomStateChange(roomname_str, anyWindowOpen_bool) { myLog(3, "reactOnRoomStateChange(): AnyWindowOpen state of room " + roomname_str + " changed to " + anyWindowOpen_bool) $('channel(rooms=' + roomname_str + ')[state.id=*.WINDOW_STATE](functions=funcHeating)').setState(toInt(anyWindowOpen_bool)) } setupRoomStateSubscriptions();
Werde da jetzt mal noch einbauen, dass zuerst auf manuellen Modus umgeschaltet wird. Dann Fenster-Status setzen. Vllt hilft das.
-
Falls hier jemand in Zukunft das selbe Problem hat: Bei mir hat es geholfen, die temperaturabhängige Fenster-Auf-Erkennung der Thermostate auszuschalten. Das geht in via CCU in den Einstellungen der Homematic IP Thermostate.