Mit Homematic IP-Sensor über Automation Manager einen Homematic Aktor steuern

Haussteuerung mittels mediola

Moderator: Co-Administratoren

Antworten
Micronomic
Beiträge: 6
Registriert: 12.05.2019, 08:26
Wohnort: Hagenow
Kontaktdaten:

Mit Homematic IP-Sensor über Automation Manager einen Homematic Aktor steuern

Beitrag von Micronomic » 16.12.2019, 01:00

Hallo,
bin komplett neu in Mediola / Javascript und habe noch keine passende Einführung gefunden.
Möchte im Automation Manager mit einem Homematic IP Fensterkontakt HMIP-SWDO einen Homematic Heizkörperthermostat HM-CC-RT-DN steuern:
Wenn Fenster auf -> Soll-Temp merken in System-Variable -> Heizung aus
Wenn Fenster zu -> gemerkte Soll-Temp setzen aus Systemvariable -> Heizung auf Auto
Ich vermute 2 Tasks welche den Sensor überwachen? (Einen für auf / einen für zu)
Eine Do While -Schleife habe ich im Blockeditor nicht gefunden. Auch nicht Loop until.
Möchte gerne alle 10 Min. eine Push-Nachricht senden bis das Fenster wieder zu ist.
Wie bekomme ich die Temeratur aus dem getDeviceStatus in die Systemvariable?
Wie setze ich die Soll-Temperatur im executeDeviceCommand auf den Wert einer Systemvariablen?
Das gleiche Szenario möchte ich auch mit HMIP-SWDO und AVM DECT Heizungsthermostat machen.
Plugins sind alle vorhanden.
Zu guter Letzt habe ich noch einen Wandthermostat HmIP-WTH-2 der einen HM-CC-RT-DN Heizkörperthermostat steuern soll:
Ist-Temperatur-Wand soll Heizkörper regeln bis Soll-Temperatur-Wand erreicht ist. Gibt es Beispielscripte für den AM dazu?

33zdenko
Beiträge: 343
Registriert: 21.12.2013, 16:50
Danksagung erhalten: 4 Mal

Re: Mit Homematic IP-Sensor über Automation Manager einen Homematic Aktor steuern

Beitrag von 33zdenko » 19.12.2019, 06:37

hi,
hast nicht angegeben was du für hardware benutzst.
Ein Mediola Gateway oder CCU, Neo Server mit CCU oder V5 Plus mit Neoserver?
du musst zuerst bei ccu und neoserver, eine neo server variable anlegen oder eine gateway variable falls du v5 gateway benutzst, typ float.

dann wäre dein script für temp schreiben in variable so:

Code: Alles auswählen

getDeviceStatus(
    "Schlafzimmer",
    "Heizung Schlafzimmer",
    {"value":"themoSetTemp","extMeta":"4.5-30.5","scale":"0.5"},
    function(err, status) {
        err && console.error(err.message);
        console.log(status);

    executeDeviceCommand(
    "AIO GATEWAY V5+ (EA)",
    "Float1",
    {"value":"setValue","ext":status,"extMeta":"-21474836.48-21474836.47","scale":"0.01"},
    function(err) {
        err && console.error(err.message);
    }
    );
        
    }
);
und so wieder aus der variable in thermostat, set temperature to...

Code: Alles auswählen

getDeviceStatus(
    "AIO GATEWAY V5+ (EA)",
    "Float1",
    {"value":"state","extMeta":"-21474836.48-21474836.47","scale":"0.01"},
    function(err, status) {
        err && console.error(err.message);
        console.log(status);
        executeDeviceCommand(
            "Schlafzimmer",
            "Heizung Schlafzimmer",
            {"value":"themoTempRaw","ext":status,"extMeta":"4.5-30.5","scale":"0.5"},
            function(err) {
                err && console.error(err.message);
            }
        );

        
    }
);
es gibt als auslöser den intervall block, den kannst du nehmen und auf 10 minuten setzen, dann falls/sons block und nach fenster offen prüfen. im Dann block eben push versenden. Da intervall aber immer laufen wird, könnte man diesen task im sonst teil mit einem script auf inactive schalten..
also falls fenster nicht offen.
hier beispiel für aktiv schalten, du musst die id des tasks herausfinden, hier im beispiel 5:

Code: Alles auswählen

const getContent = function(url) {
  // return new pending promise
  return new Promise((resolve, reject) => {
    // select http or https module, depending on reqested url
    const lib = url.startsWith('https') ? require('https') : require('http');
    const request = lib.get(url, (response) => {
      // handle http errors
      if (response.statusCode < 200 || response.statusCode > 299) {
         reject(new Error('Failed to load page, status code: ' + response.statusCode));
       }
      // temporary data holder
      const body = [];
      // on every content chunk, push it to the data array
      response.on('data', (chunk) => body.push(chunk));
      // we are done, resolve promise with those joined chunks
      response.on('end', () => resolve(body.join('')));
    });
    // handle connection errors of the request
    request.on('error', (err) => reject(err));
    });
};

getContent('http://192.168.1.20:8088/cmd?XC_FNC=setTaskActive&id=5&active=true')
                .then((html) => console.log(html))
                .catch((err) => console.error(err));
und inaktiv:

Code: Alles auswählen

const getContent = function(url) {
  // return new pending promise
  return new Promise((resolve, reject) => {
    // select http or https module, depending on reqested url
    const lib = url.startsWith('https') ? require('https') : require('http');
    const request = lib.get(url, (response) => {
      // handle http errors
      if (response.statusCode < 200 || response.statusCode > 299) {
         reject(new Error('Failed to load page, status code: ' + response.statusCode));
       }
      // temporary data holder
      const body = [];
      // on every content chunk, push it to the data array
      response.on('data', (chunk) => body.push(chunk));
      // we are done, resolve promise with those joined chunks
      response.on('end', () => resolve(body.join('')));
    });
    // handle connection errors of the request
    request.on('error', (err) => reject(err));
    });
};

getContent('http://192.168.1.20:8088/cmd?XC_FNC=setTaskActive&id=5&active=false')
                .then((html) => console.log(html))
                .catch((err) => console.error(err));
setze mal im browser folgendes ein:

Code: Alles auswählen

http://192.168.1.20:8088/cmd?XC_FNC=setTaskActive&id=5&active=false
vorher die ip adresse deines neo server anpassen sowie die id des tasks...
was heisst heizug aus?
soll temperatur auf 5 grad, einen schalter auf off schalten...?
Beantworte die fragen dann kann man weiter machen...

Micronomic
Beiträge: 6
Registriert: 12.05.2019, 08:26
Wohnort: Hagenow
Kontaktdaten:

Re: Mit Homematic IP-Sensor über Automation Manager einen Homematic Aktor steuern

Beitrag von Micronomic » 20.12.2019, 13:42

Danke für die schnelle Antwort. Habe hier eine mediola V5+ mit Zigbee und EnOcean Sticks sowie NEO-Server im Einsatz.
Werde mal die Scripte testen und berichten ;-)

Micronomic
Beiträge: 6
Registriert: 12.05.2019, 08:26
Wohnort: Hagenow
Kontaktdaten:

Re: Mit Homematic IP-Sensor über Automation Manager einen Homematic Aktor steuern

Beitrag von Micronomic » 22.12.2019, 16:20

So - Habe mal getestet:
Ein Task läuft auf der V5+ "Fenster Buero auf" der das Skript "Temperatur Buero merken" ausführt um die Systemvariable "Temperatur_Buero_soll" zu füllen und dann die Soll-Temperatur auf 8° setzt. Script "Temperatur Buero merken":
getDeviceStatus(
"Buero",
{"value":"themoSetTemp","extMeta":"4.5-30.5","scale":"0.5"},
function(err, status) {
err && console.error(err.message);
console.log(status);

executeDeviceCommand(
"AIO GATEWAY V5+ (EA)",
"Temperatur_Buero_soll",
{"value":"setValue","ext":status,"extMeta":"-21474836.48-21474836.47","scale":"0.01"},
function(err) {
err && console.error(err.message);
}
);
}
);

Systemvariable wird aber nicht gefüllt das Setzen der Temperatur geht.
Wie kann ich den Wert der Systemvariable ausgeben um zu testen ob das Skript das macht was es soll?
Frage den Wert z.Zt. im AM in den Systemvariablen ab. (ohne Ergebnis)
Logischerweise funktioniert das Setzen der Soll-Temperatur im zweiten Script "Temperatur Buero setzen" deshalb auch nicht:
getDeviceStatus(
"AIO GATEWAY V5+ (EA)",
"Temperatur_Buero_soll",
{"value":"state","extMeta":"-21474836.48-21474836.47","scale":"0.01"},
function(err, status) {
err && console.error(err.message);
console.log(status);
executeDeviceCommand(
"Buero",
"Heizung",
{"value":"themoTempRaw","ext":status,"extMeta":"4.5-30.5","scale":"0.5"},
function(err) {
err && console.error(err.message);
}
);
}
);
Wäre für eine Dokumentation die über (Zitat) "Im Skripteditor können individuelle Skripte mittels JavaScript geschriebenwerden. In der Menüleiste stehen diverse Optionen (wie Speichern, Öffnen, Status/Aktion einfügen) zur Verfügung. " hinausgeht...

Antworten

Zurück zu „mediola“