HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen
Moderator: Co-Administratoren
-
- Beiträge: 98
- Registriert: 17.10.2018, 07:14
- Danksagung erhalten: 1 Mal
HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen
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?
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
-
- 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
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
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
-
- Beiträge: 98
- Registriert: 17.10.2018, 07:14
- Danksagung erhalten: 1 Mal
Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen
@Danke an alle für die Hinweise
Hier der Flow, falls jemand das auch braucht:
Die Formel habe ich so Internet gefunden:
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"}]
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)
CCU3 mit Raspberrymatic. Addons: Redmatic mit HomeKit Plugin und Alex Skill
-
- Beiträge: 98
- Registriert: 17.10.2018, 07:14
- Danksagung erhalten: 1 Mal
Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen
Habe gelesen, dass man da noch einiges ändern muss.
Deshalb muss der Code im Funktions-Knoten so aussehen:
Und da der Flow dann auch die Luftfeuchtigkeit braucht, sieht der jetzt so aus:
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;
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"}]
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
-
- 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
Cool! Das probiere ich am WE gleich mal aus.
-
- Beiträge: 98
- Registriert: 17.10.2018, 07:14
- Danksagung erhalten: 1 Mal
Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen
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:
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
-
- Beiträge: 98
- Registriert: 17.10.2018, 07:14
- Danksagung erhalten: 1 Mal
Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen
In der Berechnung war ein massiver Bug.
Hier die Korrektur:
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
-
- 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
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:
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
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;
Für mich sehen die Werte so plausibler aus.
LG Ray
Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen
Ich möchte die Werte durch Systemvariablen füllen. Leider klappt es nicht bei mir.
So wie es aussieht werden die Werte der Variablen nicht in den Skript übertragen.
Es wäre nett, wenn mir jemand helfen könnte.
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
Raspberrymatic 3.57.4.20210320 rpi3
Re: HomeKit: Gefühlte Temperatur berechnen und zur Verfügung stellen
Schade dass bisher mir niemand helfen konnte
www.nuiler.de
Raspberrymatic 3.57.4.20210320 rpi3
Raspberrymatic 3.57.4.20210320 rpi3