Seite 1 von 2

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

Verfasst: 16.05.2019, 22:16
von mickbrisgau
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?

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

Verfasst: 16.05.2019, 22:36
von Hypnos
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

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

Verfasst: 17.05.2019, 11:39
von mickbrisgau
@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

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

Verfasst: 17.05.2019, 21:56
von mickbrisgau
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

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

Verfasst: 17.05.2019, 22:00
von nicolas-eric
Cool! Das probiere ich am WE gleich mal aus.

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

Verfasst: 20.05.2019, 08:51
von mickbrisgau
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;

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

Verfasst: 22.05.2019, 14:44
von mickbrisgau
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;

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

Verfasst: 10.01.2020, 19:34
von quitschibo
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

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

Verfasst: 11.01.2020, 16:27
von nuiler
Ich möchte die Werte durch Systemvariablen füllen. Leider klappt es nicht bei mir.
Flow-Winchill.txt
(6.21 KiB) 88-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.

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

Verfasst: 17.01.2020, 13:32
von nuiler
Schade dass bisher mir niemand helfen konnte