HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen

Node-RED als CCU3/RaspberryMatic Addon, WebApp, HomeKit, ...

Moderator: Co-Administratoren

mickbrisgau
Beiträge: 98
Registriert: 17.10.2018, 07:14
Danksagung erhalten: 1 Mal

HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen

Beitrag von mickbrisgau » 16.05.2019, 22:16

Ich möchte gerne die gefühlte Temperatur in HomeKit zur Verfügung stellen.

Das wird mit einer Formel berechnet bei der man die Windgeschwindigkeit und Temperatur braucht.

Das ganze wollte ich mit einem Funktions-Knoten und JavaScript machen.

Der empfängt aber nur ein Objekt. Also wollte ich die Nachrichten der Geräte mit dem Join-Knoten zu einem Array oder Schlüssel/Wert-Objekt zusammenfügen und dann an den Funktions-Knoten übergeben.

Aber der Join erwartet ja so viele Dinge bevor der arbeitet.

Hat jemand Ideen?
CCU3 mit Raspberrymatic. Addons: Redmatic mit HomeKit Plugin und Alex Skill

Hypnos
Beiträge: 460
Registriert: 06.01.2018, 12:48
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 57 Mal
Danksagung erhalten: 39 Mal

Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen

Beitrag von Hypnos » 16.05.2019, 22:36

Was du mit dem join Knoten kannst, kann auch alles gleich der Funktion Knoten.

Einfach mehrere Nachrichten nacheinander rein senden und die Werte Zwischenspeichern.

Um die Nachrichten auseinander zu halten nutzt man den Topic der Nachricht. Zum Zwischenspeichern von Werten gibt es Contexte.

Ist hier beschrieben:
https://nodered.org/docs/writing-functions

mickbrisgau
Beiträge: 98
Registriert: 17.10.2018, 07:14
Danksagung erhalten: 1 Mal

Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen

Beitrag von mickbrisgau » 17.05.2019, 11:39

@Danke an alle für die Hinweise

Hier der Flow, falls jemand das auch braucht:

Code: Alles auswählen

[{"id":"ef456738.fa21f","type":"ccu-rpc-event","z":"aeb8703c.8ef4b8","name":"Windgeschwindigkeit","iface":"HmIP-RF","ccuConfig":"38263145.35ea0e","rooms":"","roomsRx":"str","functions":"","functionsRx":"str","device":"001818A992BC92","deviceRx":"str","deviceName":"","deviceNameRx":"str","deviceType":"","deviceTypeRx":"str","channel":"001818A992BC92:1","channelRx":"str","channelName":"","channelNameRx":"str","channelType":"","channelTypeRx":"str","channelIndex":"","channelIndexRx":"str","datapoint":"WIND_SPEED","datapointRx":"str","change":false,"working":false,"cache":true,"topic":"WIND","x":200,"y":420,"wires":[["2106b45.00fae4c"]]},{"id":"848a6725.f4394","type":"ccu-rpc-event","z":"aeb8703c.8ef4b8","name":"Temperatur","iface":"HmIP-RF","ccuConfig":"38263145.35ea0e","rooms":"","roomsRx":"str","functions":"","functionsRx":"str","device":"001818A992BC92","deviceRx":"str","deviceName":"","deviceNameRx":"str","deviceType":"","deviceTypeRx":"str","channel":"001818A992BC92:1","channelRx":"str","channelName":"","channelNameRx":"str","channelType":"","channelTypeRx":"str","channelIndex":"","channelIndexRx":"str","datapoint":"ACTUAL_TEMPERATURE","datapointRx":"str","change":false,"working":false,"cache":true,"topic":"TEMP","x":170,"y":480,"wires":[["2106b45.00fae4c"]]},{"id":"2106b45.00fae4c","type":"function","z":"aeb8703c.8ef4b8","name":"GefuehlteTemperatur","func":"if (msg.topic === \"WIND\") {\n    context.set('wind',msg.payload);\n} else if (msg.topic === \"TEMP\") {\n    context.set('temp',msg.payload);\n}\n\nvar wind = context.get('wind')||0;\nvar temp = context.get('temp')||0;\n\nmsg.topic = \"0/CurrentTemperature\"\n\nif (wind && temp !== 0) {\n    msg.payload = 13.12 + (0.6215 * temp) - Math.pow((11.37 * wind), 0.16) + Math.pow((0.3965 * temp * wind), 0.16);\n} else {\n    return;\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":460,"wires":[["6cee6aa.8d6f994"]]},{"id":"6cee6aa.8d6f994","type":"redmatic-homekit-universal","z":"aeb8703c.8ef4b8","bridgeConfig":"df7bbdd.1c6d8c","name":"Gefuehlte-Temperatur","services":[{"subtype":"0","service":"TemperatureSensor","name":"Gefuehlte-Temperatur"}],"x":720,"y":460,"wires":[[]]},{"id":"38263145.35ea0e","type":"ccu-connection","z":"","name":"localhost","host":"localhost","regaEnabled":true,"bcrfEnabled":true,"iprfEnabled":true,"virtEnabled":true,"bcwiEnabled":false,"cuxdEnabled":false,"regaPoll":true,"regaInterval":"30","rpcPingTimeout":"60","rpcInitAddress":"127.0.0.1","rpcServerHost":"127.0.0.1","rpcBinPort":"2047","rpcXmlPort":"2048","queueTimeout":"5000","queuePause":"250","contextStore":""},{"id":"df7bbdd.1c6d8c","type":"redmatic-homekit-bridge","z":"","name":"RedMatic Bridge","username":"CC:22:3D:FB:81:ED","pincode":"484-84-791","port":"51826"}]
Die Formel habe ich so Internet gefunden:

Code: Alles auswählen

msg.payload = 13.12 + (0.6215 * temp) - Math.pow((11.37 * wind), 0.16) + Math.pow((0.3965 * temp * wind), 0.16)
Bildschirmfoto 2019-05-17 um 11.36.02.png
Bildschirmfoto 2019-05-17 um 11.36.25.png
Bildschirmfoto 2019-05-17 um 11.36.34.png
Bildschirmfoto 2019-05-17 um 11.36.49.png
Bildschirmfoto 2019-05-17 um 11.37.06.png
CCU3 mit Raspberrymatic. Addons: Redmatic mit HomeKit Plugin und Alex Skill

mickbrisgau
Beiträge: 98
Registriert: 17.10.2018, 07:14
Danksagung erhalten: 1 Mal

Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen

Beitrag von mickbrisgau » 17.05.2019, 21:56

Habe gelesen, dass man da noch einiges ändern muss.

Deshalb muss der Code im Funktions-Knoten so aussehen:

Code: Alles auswählen

if (msg.topic === "WIND") {
    context.set('wind',msg.payload);
} else if (msg.topic === "TEMP") {
    context.set('temp',msg.payload);
} else if (msg.topic === "FEUCHT") {
    context.set('feucht',msg.payload);
}

var wind   = context.get('wind')||null;
var temp   = context.get('temp')||null;
var feucht = context.get('feucht')||null;

msg.topic = "0/CurrentTemperature"

if (temp !== null) {
    if (temp < 27) {
        if (wind >= 5) {
            msg.payload = 13.12 + (0.6215 * temp) - Math.pow((11.37 * wind), 0.16) + Math.pow((0.3965 * temp * wind), 0.16);
        } else {
            msg.payload = temp;
        }
    } else {
        msg.payload = -8.785 + (1.611 * TEMP) + (2.339 * FEUCHT) + (-0.146 * TEMP * FEUCHT) + (-0.01231 * Math.pow(TEMP,2)) + (-0.01642 * Math.pow(FEUCHT,2)) + (0.002212 * Math.pow(TEMP,2) * FEUCHT) + (0.0007255 * TEMP * Math.pow(FEUCHT,2)) + (-0.000003582 * Math.pow(TEMP,2) * Math.pow(FEUCHT,2));
    }
} else {
    return;
}

var aktuelleWerte = "Temp: " + temp + ", Wind: " + wind + ", Feucht: " + feucht + ", Ergebnis: " + msg.payload;

node.status({text:aktuelleWerte});

return msg;
Und da der Flow dann auch die Luftfeuchtigkeit braucht, sieht der jetzt so aus:

Code: Alles auswählen

[{"id":"ef456738.fa21f","type":"ccu-rpc-event","z":"aeb8703c.8ef4b8","name":"Windgeschwindigkeit","iface":"HmIP-RF","ccuConfig":"38263145.35ea0e","rooms":"","roomsRx":"str","functions":"","functionsRx":"str","device":"001818A992BC92","deviceRx":"str","deviceName":"","deviceNameRx":"str","deviceType":"","deviceTypeRx":"str","channel":"001818A992BC92:1","channelRx":"str","channelName":"","channelNameRx":"str","channelType":"","channelTypeRx":"str","channelIndex":"","channelIndexRx":"str","datapoint":"WIND_SPEED","datapointRx":"str","change":false,"working":false,"cache":true,"topic":"WIND","x":200,"y":380,"wires":[["2106b45.00fae4c"]]},{"id":"848a6725.f4394","type":"ccu-rpc-event","z":"aeb8703c.8ef4b8","name":"Temperatur","iface":"HmIP-RF","ccuConfig":"38263145.35ea0e","rooms":"","roomsRx":"str","functions":"","functionsRx":"str","device":"001818A992BC92","deviceRx":"str","deviceName":"","deviceNameRx":"str","deviceType":"","deviceTypeRx":"str","channel":"001818A992BC92:1","channelRx":"str","channelName":"","channelNameRx":"str","channelType":"","channelTypeRx":"str","channelIndex":"","channelIndexRx":"str","datapoint":"ACTUAL_TEMPERATURE","datapointRx":"str","change":false,"working":false,"cache":true,"topic":"TEMP","x":170,"y":440,"wires":[["2106b45.00fae4c"]]},{"id":"2106b45.00fae4c","type":"function","z":"aeb8703c.8ef4b8","name":"GefuehlteTemperatur","func":"if (msg.topic === \"WIND\") {\n    context.set('wind',msg.payload);\n} else if (msg.topic === \"TEMP\") {\n    context.set('temp',msg.payload);\n} else if (msg.topic === \"FEUCHT\") {\n    context.set('feucht',msg.payload);\n}\n\nvar wind     = context.get('wind')||null;\nvar temp     = context.get('temp')||null;\nvar feucht   = context.get('feucht')||null;\n\nmsg.topic = \"0/CurrentTemperature\"\n\nif (temp !== null) {\n    if (temp < 27) {\n        if (wind >= 5) {\n            msg.payload = 13.12 + (0.6215 * temp) - Math.pow((11.37 * wind), 0.16) + Math.pow((0.3965 * temp * wind), 0.16);\n        } else {\n            msg.payload = temp;\n        }\n    } else {\n        msg.payload = -8.785 + (1.611 * TEMP) + (2.339 * FEUCHT) + (-0.146 * TEMP * FEUCHT) + (-0.01231 * Math.pow(TEMP,2)) + (-0.01642 * Math.pow(FEUCHT,2)) + (0.002212 * Math.pow(TEMP,2) * FEUCHT) + (0.0007255 * TEMP * Math.pow(FEUCHT,2)) + (-0.000003582 * Math.pow(TEMP,2) * Math.pow(FEUCHT,2));\n    }\n} else {\n    return;\n}\n\nvar aktuelleWerte = \"Temp: \" + temp + \", Wind: \" + wind + \", Feucht: \" + feucht + \", Ergebnis: \" + msg.payload;\n\nnode.status({text:aktuelleWerte});\n\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":440,"wires":[["6cee6aa.8d6f994"]]},{"id":"6cee6aa.8d6f994","type":"redmatic-homekit-universal","z":"aeb8703c.8ef4b8","bridgeConfig":"df7bbdd.1c6d8c","name":"Gefuehlte-Temperatur","services":[{"subtype":"0","service":"TemperatureSensor","name":"Gefuehlte-Temperatur"}],"x":720,"y":440,"wires":[[]],"icon":"font-awesome/fa-thermometer-4"},{"id":"30e8659a.dd3eea","type":"ccu-rpc-event","z":"aeb8703c.8ef4b8","name":"Luftfeuchtigkeit","iface":"HmIP-RF","ccuConfig":"38263145.35ea0e","rooms":"","roomsRx":"str","functions":"","functionsRx":"str","device":"001818A992BC92","deviceRx":"str","deviceName":"","deviceNameRx":"str","deviceType":"","deviceTypeRx":"str","channel":"001818A992BC92:1","channelRx":"str","channelName":"","channelNameRx":"str","channelType":"","channelTypeRx":"str","channelIndex":"","channelIndexRx":"str","datapoint":"HUMIDITY","datapointRx":"str","change":false,"working":false,"cache":true,"topic":"FEUCHT","x":180,"y":500,"wires":[["2106b45.00fae4c"]]},{"id":"38263145.35ea0e","type":"ccu-connection","z":"","name":"localhost","host":"localhost","regaEnabled":true,"bcrfEnabled":true,"iprfEnabled":true,"virtEnabled":true,"bcwiEnabled":false,"cuxdEnabled":false,"regaPoll":true,"regaInterval":"30","rpcPingTimeout":"60","rpcInitAddress":"127.0.0.1","rpcServerHost":"127.0.0.1","rpcBinPort":"2047","rpcXmlPort":"2048","queueTimeout":"5000","queuePause":"250","contextStore":""},{"id":"df7bbdd.1c6d8c","type":"redmatic-homekit-bridge","z":"","name":"RedMatic Bridge","username":"CC:22:3D:FB:81:ED","pincode":"484-84-791","port":"51826"}]
Bildschirmfoto 2019-05-17 um 21.56.04.png
Zuletzt geändert von mickbrisgau am 18.05.2019, 19:02, insgesamt 4-mal geändert.
CCU3 mit Raspberrymatic. Addons: Redmatic mit HomeKit Plugin und Alex Skill

nicolas-eric
Beiträge: 3302
Registriert: 07.01.2015, 23:26
Wohnort: Scheeßel
Hat sich bedankt: 21 Mal
Danksagung erhalten: 11 Mal

Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen

Beitrag von nicolas-eric » 17.05.2019, 22:00

Cool! Das probiere ich am WE gleich mal aus.

mickbrisgau
Beiträge: 98
Registriert: 17.10.2018, 07:14
Danksagung erhalten: 1 Mal

Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen

Beitrag von mickbrisgau » 20.05.2019, 08:51

Habe nochmal ein paar Änderungen vorgenommen.

Jetzt sieht man die Eingangs- und den Ausgangs-Parameter als Knotenstatus.

Ausserdem gibt er null zurück, wenn nicht alle Parameter da sind. HomeKit zeigt das dann als 0.0 Grad Celsius an.

Hier der neue verbesserte Code:

Code: Alles auswählen

if (msg.topic === "WIND") {
    context.set('wind',msg.payload);
} else if (msg.topic === "TEMP") {
    context.set('temp',msg.payload);
} else if (msg.topic === "FEUCHT") {
    context.set('feucht',msg.payload);
}

var wind   = context.get('wind');
var temp   = context.get('temp');
var feucht = context.get('feucht');

if (typeof wind === 'undefined' || typeof temp ===  'undefined' || typeof feucht ===  'undefined') {
	node.status({text:"null"});
	return null;
}

msg.topic = "0/CurrentTemperature"

if (temp !== null) {
    if (temp < 27) {
        if (wind >= 5) {
            msg.payload = 13.12 + (0.6215 * temp) - Math.pow((11.37 * wind), 0.16) + Math.pow((0.3965 * temp * wind), 0.16);
        } else {
            msg.payload = temp;
        }
    } else {
        msg.payload = -8.785 + (1.611 * TEMP) + (2.339 * FEUCHT) + (-0.146 * TEMP * FEUCHT) + (-0.01231 * Math.pow(TEMP,2)) + (-0.01642 * Math.pow(FEUCHT,2)) + (0.002212 * Math.pow(TEMP,2) * FEUCHT) + (0.0007255 * TEMP * Math.pow(FEUCHT,2)) + (-0.000003582 * Math.pow(TEMP,2) * Math.pow(FEUCHT,2));
    }
} else {
    node.status({text:"Ebenfalls null"});
    return null;
}

var aktuelleWerte = "Temp: " + temp + ", Wind: " + wind + ", Feucht: " + feucht + ", Ergebnis: " + msg.payload;

node.status({text:aktuelleWerte});

return msg;
CCU3 mit Raspberrymatic. Addons: Redmatic mit HomeKit Plugin und Alex Skill

mickbrisgau
Beiträge: 98
Registriert: 17.10.2018, 07:14
Danksagung erhalten: 1 Mal

Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen

Beitrag von mickbrisgau » 22.05.2019, 14:44

In der Berechnung war ein massiver Bug.

Hier die Korrektur:

Code: Alles auswählen

if (msg.topic === "WIND") {
    context.set('wind',msg.payload);
} else if (msg.topic === "TEMP") {
    context.set('temp',msg.payload);
} else if (msg.topic === "FEUCHT") {
    context.set('feucht',msg.payload);
}

var wind   = context.get('wind');
var temp   = context.get('temp');
var feucht = context.get('feucht');

if (typeof wind === 'undefined' || typeof temp ===  'undefined' || typeof feucht ===  'undefined') {
	node.status({text:"null"});
	return null;
}

msg.topic = "0/CurrentTemperature"

if (temp !== null) {
    if (temp < 27) {
        if (wind >= 5) {
            msg.payload = 13.12 + (0.6215 * temp) - (11.37 * Math.pow(wind, 0.1)) + (0.3965 * temp * Math.pow(wind, 0.16));
        } else {
            msg.payload = temp;
        }
    } else {
        msg.payload = -8.785 + (1.611 * TEMP) + (2.339 * FEUCHT) + (-0.146 * TEMP * FEUCHT) + (-0.01231 * Math.pow(TEMP,2)) + (-0.01642 * Math.pow(FEUCHT,2)) + (0.002212 * Math.pow(TEMP,2) * FEUCHT) + (0.0007255 * TEMP * Math.pow(FEUCHT,2)) + (-0.000003582 * Math.pow(TEMP,2) * Math.pow(FEUCHT,2));
    }
} else {
    node.status({text:"Ebenfalls null"});
    return null;
}

var aktuelleWerte = "Temp: " + temp + ", Wind: " + wind + ", Feucht: " + feucht + ", Ergebnis: " + msg.payload;

node.status({text:aktuelleWerte});

return msg;
CCU3 mit Raspberrymatic. Addons: Redmatic mit HomeKit Plugin und Alex Skill

quitschibo
Beiträge: 24
Registriert: 25.12.2015, 17:30
Hat sich bedankt: 3 Mal
Danksagung erhalten: 3 Mal

Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen

Beitrag von quitschibo » 10.01.2020, 19:34

Danke für das coole Skript. Bei mit sind für den Windchill höhere Werte als die aktuelle Temperatur berechnet worden. Ich habe die Formel nochmal angepasst:

Code: Alles auswählen

if (msg.topic === "hm-rpc/0/00181A4990452E/1/WIND_SPEED") {
    context.set('wind',msg.payload);
} else if (msg.topic === "hm-rpc/0/00181A4990452E/1/ACTUAL_TEMPERATURE") {
    context.set('temp',msg.payload);
} else if (msg.topic === "hm-rpc/0/00181A4990452E/1/HUMIDITY") {
    context.set('feucht',msg.payload);
}

var wind   = context.get('wind');
var temp   = context.get('temp');
var feucht = context.get('feucht');

if (typeof wind === 'undefined' || typeof temp ===  'undefined' || typeof feucht ===  'undefined') {
	node.status({text:"null"});
	return null;
}

msg.topic = "0/CurrentTemperature"

if (temp !== null) {
    if (temp < 27) {
        if (wind >= 5) {
            msg.payload = 13.12 + (0.6215 * temp) + ((0.3965 * temp) - 11.37) * Math.pow(wind, 0.16);
        } else {
            msg.payload = temp;
        }
    } else {
        msg.payload = -8.785 + (1.611 * TEMP) + (2.339 * FEUCHT) + (-0.146 * TEMP * FEUCHT) + (-0.01231 * Math.pow(TEMP,2)) + (-0.01642 * Math.pow(FEUCHT,2)) + (0.002212 * Math.pow(TEMP,2) * FEUCHT) + (0.0007255 * TEMP * Math.pow(FEUCHT,2)) + (-0.000003582 * Math.pow(TEMP,2) * Math.pow(FEUCHT,2));
    }
} else {
    node.status({text:"Ebenfalls null"});
    return null;
}

var aktuelleWerte = "Temp: " + temp + ", Wind: " + wind + ", Feucht: " + feucht + ", Ergebnis: " + msg.payload;

node.status({text:aktuelleWerte});

return msg;
Ich habe mich bei der Änderung an dem hier vorgestellten Skripten orientiert: viewtopic.php?t=44618.

Für mich sehen die Werte so plausibler aus.

LG Ray

nuiler
Beiträge: 207
Registriert: 15.04.2012, 11:07
Wohnort: Ostalbkreis / Deutschland

Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen

Beitrag von nuiler » 11.01.2020, 16:27

Ich möchte die Werte durch Systemvariablen füllen. Leider klappt es nicht bei mir.
Flow-Winchill.txt
(6.21 KiB) 87-mal heruntergeladen
So wie es aussieht werden die Werte der Variablen nicht in den Skript übertragen.
Es wäre nett, wenn mir jemand helfen könnte.
www.nuiler.de
Raspberrymatic 3.57.4.20210320 rpi3

nuiler
Beiträge: 207
Registriert: 15.04.2012, 11:07
Wohnort: Ostalbkreis / Deutschland

Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen

Beitrag von nuiler » 17.01.2020, 13:32

Schade dass bisher mir niemand helfen konnte
www.nuiler.de
Raspberrymatic 3.57.4.20210320 rpi3

Antworten

Zurück zu „RedMatic“