NEWS
Steuerung Heizung nach Schichtplan
-
naja…
Die Scripte für das automatische Einschalten der Heizung und der Anwesenheitserkennung kann ja davon unabhängig sein.
Ich brauche einfach die Möglichkeit, dass wenn für morgen im Kalender "Frühschicht" steht, wird die Heizung zur festgelegten Zeit hochgefahren.
Also das Ganze unabhängig von den anderen Scripten....
-
Na dann legst du ein Script an welches über ein Schedule Abends um 22 Uhr prüft ob im ical Datenpunkt für morgen Frühschicht steht..
Und wenn ja, dann setzt du im Script ein Schedule welches dann um 5 Uhr die Heizung auf die gewünschte Temperatur stellt.
Gruß
-
` > Na dann legst du ein Script an welches über ein Schedule Abends um 22 Uhr prüft ob im ical Datenpunkt für morgen Frühschicht steht..
Und wenn ja, dann setzt du im Script ein Schedule welches dann um 5 Uhr die Heizung auf die gewünschte Temperatur stellt. `
und genau das bekomme ich nicht hin, da ich nur etwas mit Blockly kann. Javascript ist für mich noch zuuu neu.
Aber genau so etwas suche ich.
Kannst du mir da helfen?
Grüße
-
Klar, wie genau sieht denn dein Eintrag für die Frühschicht aus im Kalender? Und um wie viel Uhr willst du bei Frühschicht die Heizung hochfahren?
Gruß
-
Danke
Der Eintrag heißt einfach "Frühschicht" in der Zeit von 6-15 Uhr.
Einschalten der Heizung um 4:45 Uhr für 40min.
Aber wenn ich deine Vorlage habe, kann ich das bestimmt anpassen
Grüße
-
So müsste es gehen:
Sollte eigentlich relativ selbsterklärend sein.. Falls du Fragen hast, zögere nicht..
Anzupassen sind Zeile 1-4 im Script. Habe Zeile 1-4 jetzt nur mit Beispielwerten gefüllt.
Sobald du das Script startest sollte eine Ausgabe im Log zu sehen sein, solange du "logging" auf true lässt.
Desweteren sollte auch jeden Abend um 22 Uhr die Logausgabe auftauchen.
Beachte, das Skript sucht im Kalender nach dem Wort "Morgen" .. Also muss im iCal Adapter die Option "Ersetze Datum mit Worten:" aktiviert sein.
1. Kalender-Table Datenpunkt (ical.0.data.table)
2. Datenpunkt in welchem die Temperatur gesetzt wird. (hm-rpc.0.OEQ0XXXXXXX.2.SET_TEMPERATURE)
3. Welche Temperatur soll gesetzt werden? (22)
4. Log ausgaben vom Script aktiviert. (true)
`var kalenderinhalt = getState('ical.0.data.table').val; // Kalender.data.table Datenpunkt Value var tempdatenpunkt = 'hm-rpc.0.OEQ0XXXXXXX.2.SET_TEMPERATURE'; // Datenpunt für die Temperatur var temperatur = 22; // Gewünschte Temperatur um 04:45 var logging = true; // Logging. (Auf false setzen um Logausgaben zu deaktivieren.) var schedfs = null; var morgenfs = null; var tempbevor = null; function icalheating(obj){ var datestring="date"; var eventstring="event"; morgenfs = false; for(var i = 0; i < obj.length; i++) { if (obj[i][datestring].indexOf('Morgen') === 0 && obj[i][eventstring].indexOf('Frühschicht') === 0) { if(logging) log('Für Morgen (' + obj[i][datestring] + ') steht ein passendes Event (' + obj[i][eventstring] + ') im Kalender!'); morgenfs = true; } else { if(logging) log('Event im Kalender (' + obj[i][datestring] + ' ' + obj[i][eventstring] + ') passt nicht - wird ignoriert!'); } } if (morgenfs) { if(logging) log('Morgen steht Frühschicht im Kalender.. Erstelle Schedule für 04:45.'); if(schedfs) clearSchedule(schedfs); schedfs = schedule('0 45 4 * * *', cb(function(){ tempbevor = getState(tempdatenpunkt).val; setState(tempdatenpunkt,temperatur); clearStateDelayed(tempdatenpunkt); setStateDelayed(tempdatenpunkt, tempbevor, 2700000); })); } else { if(logging) log('Morgen keine Frühschicht! Eventuell vorhandener Schedule wird gelöscht.'); if(schedfs) clearSchedule(schedfs); } } schedule("0 0 22 * * *", function () { icalheating(kalenderinhalt); }); icalheating(kalenderinhalt);` Gruß[/i][/i][/i][/i][/i][/i]
-
Dankeschön
das werde ich mal testen.
Ich muss zwei Thermostate hochfahren, aber da kann ich ja deine Variable kopieren.
Wo in dem Script steht die Einschaltdauer?
EDIT: Ah ich denke, hier steht die Einschaltdauer in Millisekunden oder:
> setStateDelayed(tempdatenpunkt, tempbevor, 2700000)
Grüße
-
Korrekt, das ist die Dauer in Millisekunden bis die Temperatur zurück gesetzt wird.
Gruß
-
also ich muss sagen…es funktioniert super
Das weckt natürlich jetzt Begehrlichkeiten. Vielleicht werde ich noch die Uhrzeit vom Hochfahren bis zum Runterfahren der Heizung in Variablen setzen, damit ich das Ganze per Vis steuern kann
Grüße
-
So müsste es gehen:
Sollte eigentlich relativ selbsterklärend sein.. Falls du Fragen hast, zögere nicht..
Anzupassen sind Zeile 1-4 im Script. Habe Zeile 1-4 jetzt nur mit Beispielwerten gefüllt.
Sobald du das Script startest sollte eine Ausgabe im Log zu sehen sein, solange du "logging" auf true lässt.
Desweteren sollte auch jeden Abend um 22 Uhr die Logausgabe auftauchen.
Beachte, das Skript sucht im Kalender nach dem Wort "Morgen" .. Also muss im iCal Adapter die Option "Ersetze Datum mit Worten:" aktiviert sein.
1. Kalender-Table Datenpunkt (ical.0.data.table)
2. Datenpunkt in welchem die Temperatur gesetzt wird. (hm-rpc.0.OEQ0XXXXXXX.2.SET_TEMPERATURE)
3. Welche Temperatur soll gesetzt werden? (22)
4. Log ausgaben vom Script aktiviert. (true)
`var kalenderinhalt = getState('ical.0.data.table').val; // Kalender.data.table Datenpunkt Value var tempdatenpunkt = 'hm-rpc.0.OEQ0XXXXXXX.2.SET_TEMPERATURE'; // Datenpunt für die Temperatur var temperatur = 22; // Gewünschte Temperatur um 04:45 var logging = true; // Logging. (Auf false setzen um Logausgaben zu deaktivieren.) var schedfs = null; var morgenfs = null; var tempbevor = null; function icalheating(obj){ var datestring="date"; var eventstring="event"; morgenfs = false; for(var i = 0; i < obj.length; i++) { if (obj[i][datestring].indexOf('Morgen') === 0 && obj[i][eventstring].indexOf('Frühschicht') === 0) { if(logging) log('Für Morgen (' + obj[i][datestring] + ') steht ein passendes Event (' + obj[i][eventstring] + ') im Kalender!'); morgenfs = true; } else { if(logging) log('Event im Kalender (' + obj[i][datestring] + ' ' + obj[i][eventstring] + ') passt nicht - wird ignoriert!'); } } if (morgenfs) { if(logging) log('Morgen steht Frühschicht im Kalender.. Erstelle Schedule für 04:45.'); if(schedfs) clearSchedule(schedfs); schedfs = schedule('0 45 4 * * *', cb(function(){ tempbevor = getState(tempdatenpunkt).val; setState(tempdatenpunkt,temperatur); clearStateDelayed(tempdatenpunkt); setStateDelayed(tempdatenpunkt, tempbevor, 2700000); })); } else { if(logging) log('Morgen keine Frühschicht! Eventuell vorhandener Schedule wird gelöscht.'); if(schedfs) clearSchedule(schedfs); } } schedule("0 0 22 * * *", function () { icalheating(kalenderinhalt); }); icalheating(kalenderinhalt);` Gruß Hallo Buzzy, ich hänge mich mal ran, allerdings, weil ich JS wieder etwas mehr verstehen will. Diesen Teil `~~[code]~~var datestring="date"; var eventstring="event";[/code]` verstehe ich nicht wirklich. Sind "date" und "event" im iCal definierte Dinge? Ich arbeite immer nur mit der html, nicht mit dem Table (da steht bei mir immer [object object] drin). Grds verstehe ich, dass du im "Datumbereich" nach dem Wort morgen suchst und nach Frühschicht im Event Bereich. Allerdings ist mir eben diese Unterscheidung nicht bekannt aus dem iCal. Und wird nicht mit dem o.g. Code einfach der Variablen ein String mit dem Inhalt "Date" zugewiesen? wie funktioniert dann dieser Teil: `~~[code]~~obj[i][datestring]` Danke für deine Erläuterungen, würds gerne verstehen[/i][/code][/i][/i][/i][/i][/i][/i] ``` `
-
Diesen Teil````
var datestring="date";
var eventstring="event";Grds verstehe ich, dass du im "Datumbereich" nach dem Wort morgen suchst und nach Frühschicht im Event Bereich. Allerdings ist mir eben diese Unterscheidung nicht bekannt aus dem iCal. Und wird nicht mit dem o.g. Code einfach der Variablen ein String mit dem Inhalt "Date" zugewiesen? wie funktioniert dann dieser Teil:``` `obj[i][datestring]` Guten Morgen, der Datenpunkt ical.0.data.table enthält ein Array in welchem sich wiederum Objekte befinden. Die Variablen datestring und eventstring habe ich nur definiert damit man "an einer Stelle schnell was ändern kann".. Man kann statt die Variablen zu benutzen auch einfach mit "obj_~~[i]~~.date" und "obj_~~[i]~~.event" die entsprechenden Werte abrufen. Arrays sind getrennte Werte die man einzeln abrufen kann sozusagen ..__ `~~[code]~~// Hier ist ein Array var beispiel = ["Wert0", "Wert1", "Wert2"];[/code]`Objekte wiederum beinhalten Werte mit dazugehörigen Namen. `~~[code]~~// Hier ist ein Objekt var beispiel2 = {name:"Peter", alter:"29"};[/code]` Hab dir schnell mal ein kleines Script zusammengekloppt welches dir mit Logausgaben zeigt was Sache ist..`~~[code]~~// Hier ist der ical.0.data.table Datenpunkt in Klartext log(JSON.stringify(getState('ical.0.data.table').val)); // Hier bauen wir ein Array mit 3 Werten. var beispiel = ["Test1", "Test2", "Test3"]; // Und geben dann Wert 1, 2 und 3 im Log aus. log(beispiel[0] + ' ' + beispiel[1] + ' ' + beispiel[2]); // Hier prüfen wir, wie viele Werte überhaupt im Array stehen? log('Es stehen --' + beispiel.length + '-- Werte im Array!'); log('----------------------------------------------------'); // Hier bauen wir ein Objekt mit 2 Werten var beispiel2 = {name:"Peter", alter:"29"}; // Hier prüfen wir welchen Wert alter hat log('Alter hat im Objekt beispiel2 den Wert ---' + beispiel2.alter + '---!'); // Hier bauen wir ein Array mit 2 Objekten als Inhalt (genau wie der iCal Adapter sie erzeugt) var icalbeispiel = [{"name":"TestName0","event":"TestEvent0"},{"name":"TestName1","event":"TestEvent1"}]; // Und die ausgabe von den Events log('Event an Position 0: ' + icalbeispiel[0].event); log('Event an Position 1: ' + icalbeispiel[1].event);[/code]` Schau dir mal die Logausgabe an wie das [object Object] vom Kalender wirklich aussieht.. Es ist ein Array [] in dem Objekte {} untergebracht sind.. "[{"date":"Morgen","event":"Restmüll"},{"date":"In einer Woche ","event":"Gelber Sack"}]" Hoffe das ist verständlich genug. Bin selber erst seit 6 Monaten mit JavaScript unterwegs. :lol: Falls du noch Fragen hast, gerne her damit. :) Gruß[/i][/i][/i] ``` `
-
Danke.
Du lernst aber viel schneller als ich, wie es scheint. :idea:
Das ical.0.data.table ein Array ist, kann ich bei mir eben nicht sehen. Das hat schon sehr geholfen
-
Das ical.0.data.table ein Array ist, kann ich bei mir eben nicht sehen. Das hat schon sehr geholfen ` Überall wo "object Object" auftaucht kannst du mit
JSON.stringify(.....) ````also für ical.0.data.table:```` JSON.stringify(getState('ical.0.data.table').val) ````in Klartext darstellen was sich hinter "object Object" verbirgt. :) Gruß
-
Danke für den Hinweis. Werde ich mal testen.
-
Kannst du mir nochmal behilflich sein?
Wenn ich nun zwei Thermostate zur Frühschicht schalten will, wie sieht das dann aus?
Eine zweite Variable anlegen für das Thermostat ist ja nicht das Problem.
Aber das Delay funktioniert dann doch nicht so oder?
Grüße
-
Wenn ich nun zwei Thermostate zur Frühschicht schalten will, wie sieht das dann aus?
Eine zweite Variable anlegen für das Thermostat ist ja nicht das Problem.
Aber das Delay funktioniert dann doch nicht so oder? `
Du kannst einfach alles mit "tempdatenpunkt" und "tempbevor" auf eine Variable "tempdatenpunkt2" und "tempbevor2" kopieren..Man könnte auch den Weg über eine Aufzählung gehen oder die Datenpunkte in ein Objekt/Array schreiben..
Hier der Weg über "tempdatenpunkt2"..
`var kalenderinhalt = getState('ical.0.data.table').val; // Kalender.data.table Datenpunkt Value var tempdatenpunkt = 'hm-rpc.0.OEQ0XXXXXXX.2.SET_TEMPERATURE'; // Datenpunt für die Temperatur var tempdatenpunkt2 = 'hm-rpc.0.OEQ0XXXXXXX.2.SET_TEMPERATURE'; // Zweiter Datenpunt für die Temperatur var temperatur = 22; // Gewünschte Temperatur um 04:45 var logging = true; // Logging. (Auf false setzen um Logausgaben zu deaktivieren.) var schedfs = null; var morgenfs = null; var tempbevor = null; var tempbevor2 = null; function icalheating(obj){ var datestring="date"; var eventstring="event"; morgenfs = false; for(var i = 0; i < obj.length; i++) { if (obj[i][datestring].indexOf('Morgen') === 0 && obj[i][eventstring].indexOf('Frühschicht') === 0) { if(logging) log('Für Morgen (' + obj[i][datestring] + ') steht ein passendes Event (' + obj[i][eventstring] + ') im Kalender!'); morgenfs = true; } else { if(logging) log('Event im Kalender (' + obj[i][datestring] + ' ' + obj[i][eventstring] + ') passt nicht - wird ignoriert!'); } } if (morgenfs) { if(logging) log('Morgen steht Frühschicht im Kalender.. Erstelle Schedule für 04:45.'); if(schedfs) clearSchedule(schedfs); schedfs = schedule('0 45 4 * * *', cb(function(){ // Hier beginnt der Abschnitt für das erste Thermostat tempbevor = getState(tempdatenpunkt).val; setState(tempdatenpunkt,temperatur); clearStateDelayed(tempdatenpunkt); setStateDelayed(tempdatenpunkt, tempbevor, 2700000); // Hier beginnt der Abschnitt für das zweite Thermostat. tempbevor2 = getState(tempdatenpunkt2).val; setState(tempdatenpunkt2,temperatur); clearStateDelayed(tempdatenpunkt2); setStateDelayed(tempdatenpunkt2, tempbevor2, 2700000); })); } else { if(logging) log('Morgen keine Frühschicht! Eventuell vorhandener Schedule wird gelöscht.'); if(schedfs) clearSchedule(schedfs); } } schedule("0 0 22 * * *", function () { icalheating(kalenderinhalt); }); icalheating(kalenderinhalt);` Gruß[/i][/i][/i][/i][/i][/i]
-
Dankeschön
werde ich einbauen
Grüße
-
Ich muß mich hier auch mal anhängen, obwohl der Beitrag schon Staub ansetzt
JavaScript ist für mich auch noch komplettes neuland und ich verstehe jetzt gar nicht was ich damit anfangen kann.
Das ical.0.data.table ein Array ist, kann ich bei mir eben nicht sehen. Das hat schon sehr geholfen
Überall wo "object Object" auftaucht kannst du mit…
Wo genau muß ich das einsetzen, damit ich das wo in Klarschrift sehe?
` > ````
JSON.stringify(.....)
also für ical.0.data.table:
JSON.stringify(getState('ical.0.data.table').val)
````in Klartext darstellen was sich hinter "object Object" verbirgt. `Danke schonmal!!
-
Hi,
wie weit bist du denn jetzt?
Was genau möchtest du erreichen?
Wie sieht dein Script bis jetzt aus?
Gruß
-
Hi,
wie weit bist du denn jetzt?
Was genau möchtest du erreichen?
Wie sieht dein Script bis jetzt aus?
Gruß ` Das Sript selber kann ich noch nicht gebrauchen. Noch kein Thermostat. Ich möchte aber schon mal lernen das zu verstehen, darum die vorige Frage
Gesendet von Unterwegs mit Tapatalk