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

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

Moderator: Co-Administratoren

Antworten
mickbrisgau
Beiträge: 81
Registriert: 17.10.2018, 07:14

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: 285
Registriert: 06.01.2018, 12:48
Hat sich bedankt: 19 Mal
Danksagung erhalten: 3 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: 81
Registriert: 17.10.2018, 07:14

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: 81
Registriert: 17.10.2018, 07:14

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: 3173
Registriert: 07.01.2015, 23:26
Wohnort: Scheeßel
Hat sich bedankt: 9 Mal
Danksagung erhalten: 5 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: 81
Registriert: 17.10.2018, 07:14

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: 81
Registriert: 17.10.2018, 07:14

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

Antworten

Zurück zu „RedMatic“