Acties:
  • 0 Henk 'm!

  • denuz
  • Registratie: Augustus 2006
  • Laatst online: 02:41
OcGuru schreef op woensdag 3 mei 2023 @ 17:24:
[...]


Nog niet veel :P

Heb nu een dropdown helper in HA gemaakt met de gewenste uitschakeltijden. Dus 20:00, 22:00, 23:00 enz.

Met een change node schrijf ik deze naar een global variable
Idem met de actuele tijd.

Daarna weer een inject node met beide variable naar een switch node die beide vergelijkt. Zijn beide gelijk aan elkaar gaat de buitenlamp uit.

Kan vast veel simpeler maar het werkt :+ :o
Ipv een dropdown helper kan je ook een time/date helper aanmaken. Deze kun je direct op de ingestelde tijd laten triggeren.
Afbeeldingslocatie: https://tweakers.net/i/WGu26BsI5GAonQEPX5Ydy0gkQZU=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/nmFNEeI8BMotBYS31gsp9Vqh.png?f=user_large
Heb je maar 1 node nodig, namelijk de Time node.

Acties:
  • 0 Henk 'm!

  • OcGuru
  • Registratie: Juni 2004
  • Laatst online: 21:01

OcGuru

Giulietta Qv

denuz schreef op woensdag 3 mei 2023 @ 18:37:
[...]

Ipv een dropdown helper kan je ook een time/date helper aanmaken. Deze kun je direct op de ingestelde tijd laten triggeren.
[Afbeelding]
Heb je maar 1 node nodig, namelijk de Time node.
Thx, handige functie inderdaad, wist ik niet.

Heb het inmiddels anders gedaan, nog steeds een dropdown box met verschillende tijden en nu ook de keuze tot automatisch.

Buitenlamp gaat nog steeds aan op basis van de status van sun.sun entity ( below horizon) en gaat op de tijd die gekozen is uit. Of op de stand Automatisch op de status sun.sun entity ( above horizon) uit.


Ben benieuwd of de lamp morgenochtend uit is :P

Bl44t


Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
MikeyMan schreef op woensdag 3 mei 2023 @ 13:45:
@musicpixel Ben op basis van je suggestie eens gaan kijken om m'n zonnescherm flow een beetje anders op te bouwen, met losse functies per 'input'.

Maar loop een beetje vast in mijn gedachtegang merk ik.
Als inputs heb ik:
- Windsnelheid (nu nog van online aanbieder)
- Licht (vanuit tahoma api)
- Kamertemperatuur (vanuit Evohome Api)

Op dit moment heb ik dit allemaal in een enkele functie gepropt. Het werkt op zich best aardig, behalve dat ik nu liever het openen en sluiten van de zonwering bij een ander aantal lux zou willen regelen. Dus toch maar aan de slag gegaan met uit elkaar trekken.
Per input een functie die de losse tests doet geeft hierbij inderdaad wat meer flexibiliteit.

heb nu deze flow:
code:
1
[{"id":"ac5c855a4203b94a","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Sunscreen Light","func":"let SetpointDown = global.get('Tahoma.Light_Down', \"file\");\nlet SetpointUp = global.get('Tahoma.Light_Up', \"file\");\n\nif (msg.payload <  SetpointUp)\n{\n    msg.payload = \"Up\";\n    return msg;\n}\n\nelse if (msg.payload >= SetpointDown)\n{\n    msg.payload = \"Down\"\n    return msg;\n}\n\n\nelse\n{\n    msg.payload = \"Hold\"    \n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1980,"y":1120,"wires":[["ddde0956f5a04cb9","a3b06caac89f4822","06eabc507ba89fdc"]]},{"id":"ddde0956f5a04cb9","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug licht","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2310,"y":1120,"wires":[]},{"id":"a3b06caac89f4822","type":"ui_text","z":"743a62898f598be4","g":"c8d703f331c6071d","group":"cdd6bc3a70d5012e","order":1,"width":0,"height":0,"name":"","label":"Licht","format":"{{msg.payload}}","layout":"row-spread","className":"","x":2290,"y":1160,"wires":[]},{"id":"06eabc507ba89fdc","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Function gym test","func":"//var Wind = global.get('Tahoma.Wind_Screens', \"file\");\nvar Wind = msg.wind;\nvar Temp = global.get('Tahoma.Temp_Gym', 'file');\n\nif (msg.payload == 'Down' && Wind == 'Down' && Temp == 'Down')\n{\nmsg.payload = 'Down';\n}\n\nelse if (msg.payload == 'Up' || Wind == 'Up' || Temp == 'Up')\n{\nmsg.payload = 'Up' + Wind; \n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":2390,"y":1240,"wires":[["5a8dc3d7c7823340"]]},{"id":"5a8dc3d7c7823340","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 183","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":2670,"y":1240,"wires":[]},{"id":"c23caaad5005c3ce","type":"link in","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Link in Wind","links":["f0556cd2fb75c2e1"],"x":1825,"y":1380,"wires":[["536325eae80dc1af","09c152d5c4f3b9f4"]]},{"id":"536325eae80dc1af","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"function Wind Test","func":"var msg1 = {};\nvar msg2 = {};\nvar msg3 = {};\n\nvar windWoonkamer = global.get('Wind.Woonkamer', \"file\");\nvar windScreens = global.get('Wind.Screens', \"file\");\nvar windZipscreens = global.get('Wind.Zipscreens', \"file\");\n\nvar tahomaWind_Woonkamer = {};\nvar tahomaWind_Screens = {};\nvar tahomaWind_Zipscreens = {};\n\nif (msg.payload <= windWoonkamer)\n{\n    msg1.wind = 'Down';\n    global.set('Tahoma.Wind_Woonkamer',\"Down\", \"file\");\n}\n\nelse\n{\n    msg1.wind = 'Up';\n    global.set('Tahoma.Wind_Woonkamer', \"Up\", \"file\");\n}\n\nif (msg.payload <= windScreens)\n{\n    msg2.wind = 'Down';\n    global.set('Tahoma.Wind_Screens', \"Down\", \"file\");\n}\n\nelse \n{\n    msg2.wind = 'Up';\n    global.set('Tahoma.Wind_Screens', \"Up\", \"file\");\n}\n\nif (msg.payload <= windScreens)\n{\n    msg3.wind = 'Down';\n    global.set('Tahoma.Wind_Zipscreens', \"Down\", \"file\");\n}\n\nelse\n{\n    msg3.wind = 'Up';\n    global.set('Tahoma.Wind_Zipscreens', \"Up\", \"file\");\n}\n\nreturn [msg1,msg2,msg3];","outputs":3,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1990,"y":1380,"wires":[["9bc60edb91af0dbd"],["1258b9d18c21d2f4","06eabc507ba89fdc"],["f4a88f5837c3ee58"]]},{"id":"9bc60edb91af0dbd","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug wind woonkamer","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":2270,"y":1320,"wires":[]},{"id":"09c152d5c4f3b9f4","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 185","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1970,"y":1320,"wires":[]},{"id":"1258b9d18c21d2f4","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug wind screens","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":2260,"y":1380,"wires":[]},{"id":"f4a88f5837c3ee58","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug wind zipscreens","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":2260,"y":1440,"wires":[]},{"id":"cdd6bc3a70d5012e","type":"ui_group","name":"Current State","tab":"21daaeaaf5421973","order":3,"disp":true,"width":"12","collapse":false,"className":""},{"id":"21daaeaaf5421973","type":"ui_tab","name":"Zonneschermen","icon":"wi-wu-mostlysunny","order":14,"disabled":false,"hidden":false}]


Met als uiteindelijke functie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//var Wind = global.get('Tahoma.Wind_Screens', "file");
var Wind = msg.wind;
var Temp = global.get('Tahoma.Temp_Gym', 'file');

if (msg.payload == 'Down' && Wind == 'Down' && Temp == 'Down')
{
msg.payload = 'Down';
}

else if (msg.payload == 'Up' || Wind == 'Up' || Temp == 'Up')
{
msg.payload = 'Up' + Wind; 
}

return msg;


Hiermee is het op zich ook prima werkend te krijgen.
Enige waar ik nu tegenaan loop is dat de lichtsensor de enige trigger is. Die loopt elke vijf minuten.
Maar; hoe gebruik je nu twee inputs als trigger voor een functienode? Zou namelijk graag de windsnelheid onafhankelijk willen laten triggeren. Echter; als ik deze beide aan de functienode zet, krijg ik een asynchrone trigger met onvolledige info.
Zit naar je flow te kijken, maar heb het idee dat ik de helft mis. Ik zie bijvoorbeeld nergens waar die globals gezet worden, of waar de link-in node wordt aangeroepen.

Dit is alles wat ik zie als ik 'm importeer:
Afbeeldingslocatie: https://tweakers.net/i/-sfk2xObAL1yHXn-rcTyvQTwNCI=/800x/filters:strip_icc():strip_exif()/f/image/e3jt77nbvCfheDpiMsMUPqVs.jpg?f=fotoalbum_large

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

musicpixel schreef op donderdag 4 mei 2023 @ 23:08:
[...]


Zit naar je flow te kijken, maar heb het idee dat ik de helft mis. Ik zie bijvoorbeeld nergens waar die globals gezet worden, of waar de link-in node wordt aangeroepen.

Dit is alles wat ik zie als ik 'm importeer:
[Afbeelding]
Ja klopt. Wilde er niet een enorme import van maken. Maar maakt het idd niet makkelijker snap ik.

Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
MikeyMan schreef op donderdag 4 mei 2023 @ 23:19:
[...]


Ja klopt. Wilde er niet een enorme import van maken. Maar maakt het idd niet makkelijker snap ik.
Is beetje moeilijk zo ja ;) . Kun je m in z'n geheel delen?

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

musicpixel schreef op donderdag 4 mei 2023 @ 23:24:
[...]


Is beetje moeilijk zo ja ;) . Kun je m in z'n geheel delen?
Jahoor... Niet schrikken! :P

edit: niet dus... Teveel tekens.
Zo maar dan:
https://github.com/MikeyMan83/Tahoma-Node-Red/tree/main

Ben dus een aparte afsplitsing begonnen in het reeds werkende spul.
Denk dat ik er een beetje te moeilijk over denk qua opbouw.

Op zich werken de functies wel prima nu. Maar wil nu een onderscheid maken in zonneschermen uit (bij zeg 20k lux) en zonneschermen in (bij zeg 15k lux). Dat toevoegen aan de bestaande functies maakt het geheel weer een heel stuk lastiger. Vandaar dat ik je suggestie wilde oppakken om het meer te scheiden.

[ Voor 40% gewijzigd door MikeyMan op 05-05-2023 09:54 ]


Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
MikeyMan schreef op vrijdag 5 mei 2023 @ 09:51:
[...]


Jahoor... Niet schrikken! :P

edit: niet dus... Teveel tekens.
Zo maar dan:
https://github.com/MikeyMan83/Tahoma-Node-Red/tree/main

Ben dus een aparte afsplitsing begonnen in het reeds werkende spul.
Denk dat ik er een beetje te moeilijk over denk qua opbouw.

Op zich werken de functies wel prima nu. Maar wil nu een onderscheid maken in zonneschermen uit (bij zeg 20k lux) en zonneschermen in (bij zeg 15k lux). Dat toevoegen aan de bestaande functies maakt het geheel weer een heel stuk lastiger. Vandaar dat ik je suggestie wilde oppakken om het meer te scheiden.
Zo, dat ziet er complex uit... daar moet ik even voor gaan zitten. ;)
Zal je later vast nog wat vragen stellen...

Klopt het dat er wat verbindingslijntjes ontbreken? Onder andere hier:
Afbeeldingslocatie: https://tweakers.net/i/VMpPG8qgMRakiKeq5BlYn5QKp3k=/800x/filters:strip_icc():strip_exif()/f/image/zjEocGyN6CGqelARECqJlXP3.jpg?f=fotoalbum_large
en hier:
Afbeeldingslocatie: https://tweakers.net/i/V1o2-0iCVgDiAqZF4_FeFk3k8P8=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/epnIH3BylrCtndhdIvltRtFB.jpg?f=user_large


Verder: als er belangrijke wachtwoorden of geolocaties in de json staan zou ik m weer van github verwijderen.

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
@MikeyMan
Ik zie onder andere:

global.get('EvoHome_woonkamer_PV', "file");
global.get('EvoHome_woonkamer_SP', "file");
global.get('Tahoma_setpoint', "file");
etc

Zou je nog de flow kunnen delen waar deze globals gezet worden?

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
@MikeyMan
Ik zou ook wel willen weten wat de output van de "Get Devices" node is.

Mijn idee is overigens om je te laten zien hoe je alles zeer sterk kunt versimpelen,

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

musicpixel schreef op vrijdag 5 mei 2023 @ 16:29:
@MikeyMan
Ik zou ook wel willen weten wat de output van de "Get Devices" node is.

Mijn idee is overigens om je te laten zien hoe je alles zeer sterk kunt versimpelen,
Wat een gepruts he... Verbazingwekkend dat het überhaupt werkt zo _O-

Ben momenteel niet thuis, de output van die get devices is vrij rommelig. Das de hele api aanroep vanuit de tahoma api. Waar ik dus eigenlijk alleen het aantal lux uit sloop.

Snap er alleen niks van dat bij jou de lijken in dat stuk van de flow niet verbonden zijn. Dat waren ze bij mij voor het exporteren wel.

Onderaan mist er nog wel iets aan links. Die hoef ik denk ik niet op te halen on boot.

Krijg het op mn mobiel niet voor elkaar om een fatsoenlijke export te maken. Die komt als ik thuis ben :*)

Acties:
  • +1 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
@MikeyMan Ik had vorig weekend een klein beginnetje gemaakt, maar wilde dat nog niet delen voor ik die andere export, etc van je had gehad, dus ik vroeg me af of je ondertussen alweer thuis bent? ;)
Ik verwacht er namelijk dit weekend wat tijd voor te hebben...

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • Woohooo
  • Registratie: Februari 2001
  • Laatst online: 20:19

Woohooo

Smilie, James Smilie

Wij hadden last van een geest hier in huis die elke keer het badkamer licht aan deed, vooral overdag. Aldus mn vriendin :+

Had een Aqara switch hangen in de badkamer (WXKG11LM) die op basis van een click de state aanpast

Afbeeldingslocatie: https://tweakers.net/i/Ji1E78HUx_uqKJWpteptmksrJtY=/800x/filters:strip_exif()/f/image/jT2mpPqQjq7UEYlEHwhbkggl.png?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/qJ8fCcs9iLhrz1DyGORstjJoeBQ=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/40kBp9NrcZj2bFsuEeYP4y5X.png?f=user_large

Best wel ff moeten zoeken maar de state van die Aqara switch stond dus zo;

Afbeeldingslocatie: https://tweakers.net/i/VKeeg_c4tuSjZS4icH6eI3RPWjo=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/ME1g6NKyIVy3UwVJUIEdtgcI.png?f=user_large

Een paar keer per dag valt de verbinding kennelijk weg en kreeg ik een unknown state, daarna ging het licht aan voor een uurtje |:(

Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

musicpixel schreef op vrijdag 12 mei 2023 @ 13:46:
@MikeyMan Ik had vorig weekend een klein beginnetje gemaakt, maar wilde dat nog niet delen voor ik die andere export, etc van je had gehad, dus ik vroeg me af of je ondertussen alweer thuis bent? ;)
Ik verwacht er namelijk dit weekend wat tijd voor te hebben...
Yes, ben thuis! Nu even uitzoeken waar ik precies alles vandaan heb gehaald :P

Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

Zojuist nieuwe json op github gezet.

Gelijk maar even uitzoeken hoe daar te verwijderen ook...

Acties:
  • 0 Henk 'm!

  • ray1979
  • Registratie: April 2006
  • Laatst online: 19-09 12:15
FrankJ91 schreef op zondag 24 mei 2020 @ 20:56:
[...]


Toevallig was ik hier van de week ook mee bezig. Leuk om te zien hoe jij nu ook probeert om de zonwering niet zo vaak op en neer te laten gaan. Ik doe het ook met het weer maar is voor mij ook nog wel een uitdaging hoe ik zon/regen en wind combineer. Heb zelf een node ertussen die het gemiddelde/max uitrekent, dus bij mij zou hij nooit elk minuut op en neergaan maar in het ergste geval wel elke 20 min... Helaas is het nu slecht weer maar deze week hoop ik te zien of hij beetje doet wat ik wil :p

[Afbeelding]
Deze flow ziet er perfect uit. Heb je deze nog actief? Zo ja, zou je de code hier willen delen? Zou een perfect startpunt voor mijn automatisering zijn.

Acties:
  • +1 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
MikeyMan schreef op vrijdag 12 mei 2023 @ 19:15:
[...]


Yes, ben thuis! Nu even uitzoeken waar ik precies alles vandaan heb gehaald :P
Nieuwe Json even bekeken en ik kan nog niet echt vinden waar de volgende globals worden gezet:

global.get('EvoHome_woonkamer_PV', "file");
global.get('EvoHome_woonkamer_SP', "file");
global.get('Tahoma_setpoint', "file");
(deze staan in de "Functie Woonkamer", zelfde idee voor de andere functies)

Ik zie nu wel een heleboel LinkOut nodes die nergens naartoe gaan (zal dat deel wel missen) waarbij ik vermoed dat daarachter deze globals gezet worden?

Feel free to Buy me a coffee


Acties:
  • +1 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

musicpixel schreef op zaterdag 13 mei 2023 @ 20:42:
[...]


Nieuwe Json even bekeken en ik kan nog niet echt vinden waar de volgende globals worden gezet:

global.get('EvoHome_woonkamer_PV', "file");
global.get('EvoHome_woonkamer_SP', "file");
global.get('Tahoma_setpoint', "file");
(deze staan in de "Functie Woonkamer", zelfde idee voor de andere functies)

Ik zie nu wel een heleboel LinkOut nodes die nergens naartoe gaan (zal dat deel wel missen) waarbij ik vermoed dat daarachter deze globals gezet worden?
Excuus, dacht dat ik compleet was.

Komen zo te zien hier vandaan voor wat betreft EvoHome:
code:
1
[{"id":"fc18afd7869318ac","type":"tab","label":"EvoHome to MQTT","disabled":false,"info":"","env":[]},{"id":"397ad3f39c905319","type":"evohome-status","z":"fc18afd7869318ac","confignode":"7687a3a898660764","name":"Thuis","interval":"180","x":210,"y":560,"wires":[["c0a0d61889f6a940","55a51230139c569d","7e8daff12e88aaf7","dfc13c48320b95b5","2fe953edf6b5a4cc","3f90781fa816a3d2","9f62cb20a9c885e1","d5fa5883d49f1ad9"]]},{"id":"c0a0d61889f6a940","type":"debug","z":"fc18afd7869318ac","name":"debug evohome api","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":690,"y":160,"wires":[]},{"id":"0d623e246dca3e4c","type":"debug","z":"fc18afd7869318ac","name":"debug woonkamer evohome API","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1490,"y":380,"wires":[]},{"id":"a32052157634c93d","type":"function","z":"fc18afd7869318ac","name":"Woonkamer","func":"var Temperatuur = {};\nTemperatuur = msg.payload.currentTemperature;\nvar Setpoint = {};\nSetpoint = msg.payload.targetTemperature;\n\n/* de opties zijn:\n- woonkamer\n- babykamer\n- slaapkamer\n- gym\n- kantoor\n- garage\n- 2e verdieping\n*/\n\nif (msg.payload.name == 'woonkamer') \n{\n\n    global.set('EvoHome_woonkamer_PV', Temperatuur, \"file\");\n    global.set('EvoHome_woonkamer_SP', Setpoint, \"file\");\n    msg.payload = { \"Temp\": Temperatuur, \"Setpoint\": Setpoint };\n\n    return [msg]\n\n}\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1170,"y":380,"wires":[["0d623e246dca3e4c"]]},{"id":"395e970ea0b4eb97","type":"debug","z":"fc18afd7869318ac","name":"debug babykamer evohome API","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1490,"y":440,"wires":[]},{"id":"befaf2a23f6d88c2","type":"function","z":"fc18afd7869318ac","name":"Babykamer","func":"var Temperatuur = {};\nvar Setpoint = {};\n\n/* de opties zijn:\n- woonkamer\n- babykamer\n- slaapkamer\n- gym\n- kantoor\n- garage\n- 2e verdieping\n*/\n\nif (msg.payload.name == 'babykamer') \n{\n\n    Temperatuur = msg.payload.currentTemperature;\n    global.set('EvoHome_babykamer_PV', Temperatuur, \"file\");\n    Setpoint = msg.payload.targetTemperature;\n    global.set('EvoHome_babykamer_SP', Setpoint, \"file\");\n    msg.payload = { \"Temp\": Temperatuur, \"Setpoint\": Setpoint };\n\n    return [msg]\n\n}\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1170,"y":440,"wires":[["395e970ea0b4eb97"]]},{"id":"273a94d93154b1c7","type":"function","z":"fc18afd7869318ac","name":"Slaapkamer","func":"var Temperatuur = {};\nvar Setpoint = {};\n\n/* de opties zijn:\n- woonkamer\n- babykamer\n- slaapkamer\n- gym\n- kantoor\n- garage\n- 2e verdieping\n*/\n\nif (msg.payload.name == 'slaapkamer') \n{\n\n    Temperatuur = msg.payload.currentTemperature;\n    global.set('EvoHome_slaapkamer_PV', Temperatuur, \"file\");\n    Setpoint = msg.payload.targetTemperature;\n    global.set('EvoHome_slaapkamer_SP', Setpoint, \"file\");\n    msg.payload = { \"Temp\": Temperatuur, \"Setpoint\": Setpoint };\n\n    return [msg]\n\n}\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1170,"y":500,"wires":[["551fadca942074e5"]]},{"id":"551fadca942074e5","type":"debug","z":"fc18afd7869318ac","name":"debug slaapkamer evohome API","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1490,"y":500,"wires":[]},{"id":"932120526c45ac22","type":"function","z":"fc18afd7869318ac","name":"Gym","func":"var Temperatuur = {};\nvar Setpoint = {};\n\n\n/* de opties zijn:\n- woonkamer\n- babykamer\n- slaapkamer\n- gym\n- kantoor\n- garage\n- 2e verdieping\n*/\n\nif (msg.payload.name == 'gym') \n{\n\n    Temperatuur = msg.payload.currentTemperature;\n    global.set('EvoHome_gym_PV', Temperatuur, \"file\");\n    Setpoint = msg.payload.targetTemperature;\n    global.set('EvoHome_gym_SP', Setpoint, \"file\");\n    msg.payload = { \"Temp\": Temperatuur, \"Setpoint\": Setpoint };\n\n    return [msg]\n\n}\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1150,"y":560,"wires":[["ceac925bf555e6e6"]]},{"id":"ceac925bf555e6e6","type":"debug","z":"fc18afd7869318ac","name":"debug gym evohome API","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1470,"y":560,"wires":[]},{"id":"cef2c283a6e09414","type":"function","z":"fc18afd7869318ac","name":"Kantoor","func":"var Temperatuur = {};\nvar Setpoint = {};\n\n\n/* de opties zijn:\n- woonkamer\n- babykamer\n- slaapkamer\n- gym\n- kantoor\n- garage\n- 2e verdieping\n*/\n\nif (msg.payload.name == 'kantoor') \n{\n\n    Temperatuur = msg.payload.currentTemperature;\n        global.set('EvoHome_kantoor_PV', Temperatuur, \"file\");\n    Setpoint = msg.payload.targetTemperature;\n    global.set('EvoHome_kantoor_SP', Setpoint, \"file\");\n    msg.payload = { \"Temp\": Temperatuur, \"Setpoint\": Setpoint };\n\n    return [msg]\n\n}\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1160,"y":620,"wires":[["abe63276ecfe470e"]]},{"id":"abe63276ecfe470e","type":"debug","z":"fc18afd7869318ac","name":"debug kantoor evohome API","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1480,"y":620,"wires":[]},{"id":"54bed4b1cdf2fa31","type":"function","z":"fc18afd7869318ac","name":"Garage","func":"var Temperatuur = {};\nvar Setpoint = {};\n\n/* de opties zijn:\n- woonkamer\n- babykamer\n- slaapkamer\n- gym\n- kantoor\n- garage\n- 2e verdieping\n*/\n\nif (msg.payload.name == 'garage') \n{\n\n    Temperatuur = msg.payload.currentTemperature;\n    global.set('EvoHome_garage_PV', Temperatuur, \"file\");\n    Setpoint = msg.payload.targetTemperature;\n    global.set('EvoHome_garage_SP', Setpoint, \"file\");\n    msg.payload = { \"Temp\": Temperatuur, \"Setpoint\": Setpoint };\n\n    return [msg]\n\n}\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1160,"y":680,"wires":[["b941e9120b8c361e"]]},{"id":"b941e9120b8c361e","type":"debug","z":"fc18afd7869318ac","name":"debug garage evohome API","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1480,"y":680,"wires":[]},{"id":"e366c003d5c1a55c","type":"debug","z":"fc18afd7869318ac","name":"debug 2e verdieping evohome API","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1500,"y":740,"wires":[]},{"id":"f8b42e274f343306","type":"function","z":"fc18afd7869318ac","name":"2e Verdieping","func":"var Temperatuur = {};\nvar Setpoint = {};\n\n\n/* de opties zijn:\n- woonkamer\n- babykamer\n- slaapkamer\n- gym\n- kantoor\n- garage\n- 2e verdieping\n*/\n\nif (msg.payload.name == '2e verdieping') \n{\n\n    Temperatuur = msg.payload.currentTemperature;\n    global.set('EvoHome_2everdieping_PV', Temperatuur, \"file\");\n    Setpoint = msg.payload.targetTemperature;\n    global.set('EvoHome_2everdieping_SP', Setpoint, \"file\");\n    msg.payload = { \"Temp\": Temperatuur, \"Setpoint\": Setpoint };\n\n    return [msg]\n\n}\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1180,"y":740,"wires":[["e366c003d5c1a55c"]]},{"id":"55a51230139c569d","type":"function","z":"fc18afd7869318ac","name":"Woonkamer filter","func":"if (msg.payload.name == 'woonkamer') \nreturn [msg]","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":710,"y":380,"wires":[["2716bca27e8b0e93","ab3952e03a7838c7"]]},{"id":"ab3952e03a7838c7","type":"debug","z":"fc18afd7869318ac","name":"debug 152","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1070,"y":260,"wires":[]},{"id":"2716bca27e8b0e93","type":"smooth","z":"fc18afd7869318ac","name":"","property":"payload.currentTemperature","action":"mean","count":"3","round":"2","mult":"single","reduce":false,"x":960,"y":380,"wires":[["a32052157634c93d","4433521710b33e83"]]},{"id":"7e8daff12e88aaf7","type":"function","z":"fc18afd7869318ac","name":"Babykamer filter","func":"if (msg.payload.name == 'babykamer') \nreturn [msg]","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":700,"y":440,"wires":[["b4353240a13d0723"]]},{"id":"dfc13c48320b95b5","type":"function","z":"fc18afd7869318ac","name":"Slaapkamer filter","func":"if (msg.payload.name == 'slaapkamer') \nreturn [msg]","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":710,"y":500,"wires":[["040c8ae0148925b4"]]},{"id":"b4353240a13d0723","type":"smooth","z":"fc18afd7869318ac","name":"","property":"payload.currentTemperature","action":"mean","count":"3","round":"2","mult":"single","reduce":false,"x":960,"y":440,"wires":[["befaf2a23f6d88c2"]]},{"id":"040c8ae0148925b4","type":"smooth","z":"fc18afd7869318ac","name":"","property":"payload.currentTemperature","action":"mean","count":"3","round":"2","mult":"single","reduce":false,"x":960,"y":500,"wires":[["273a94d93154b1c7"]]},{"id":"2fe953edf6b5a4cc","type":"function","z":"fc18afd7869318ac","name":"Gym filter","func":"if (msg.payload.name == 'gym') \nreturn [msg]","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":560,"wires":[["f58389e2cfebc297"]]},{"id":"f58389e2cfebc297","type":"smooth","z":"fc18afd7869318ac","name":"","property":"payload.currentTemperature","action":"mean","count":"3","round":"2","mult":"single","reduce":false,"x":960,"y":560,"wires":[["932120526c45ac22"]]},{"id":"3f90781fa816a3d2","type":"function","z":"fc18afd7869318ac","name":"Kantoor filter","func":"if (msg.payload.name == 'kantoor') \nreturn [msg]","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":690,"y":620,"wires":[["b1e86b9bdc404c99"]]},{"id":"9f62cb20a9c885e1","type":"function","z":"fc18afd7869318ac","name":"Garage filter","func":"if (msg.payload.name == 'garage') \nreturn [msg]","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":690,"y":680,"wires":[["9a1f4e28264f8b8d"]]},{"id":"b1e86b9bdc404c99","type":"smooth","z":"fc18afd7869318ac","name":"","property":"payload.currentTemperature","action":"mean","count":"3","round":"2","mult":"single","reduce":false,"x":960,"y":620,"wires":[["cef2c283a6e09414"]]},{"id":"9a1f4e28264f8b8d","type":"smooth","z":"fc18afd7869318ac","name":"","property":"payload.currentTemperature","action":"mean","count":"3","round":"2","mult":"single","reduce":false,"x":960,"y":680,"wires":[["54bed4b1cdf2fa31"]]},{"id":"d5fa5883d49f1ad9","type":"function","z":"fc18afd7869318ac","name":"Woonkamer filter","func":"if (msg.payload.name == '2e verdieping') \nreturn [msg]","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":710,"y":740,"wires":[["343e98a103361ec7"]]},{"id":"343e98a103361ec7","type":"smooth","z":"fc18afd7869318ac","name":"","property":"payload.currentTemperature","action":"mean","count":"3","round":"2","mult":"single","reduce":false,"x":960,"y":740,"wires":[["f8b42e274f343306","30739de5eaa89282"]]},{"id":"4433521710b33e83","type":"debug","z":"fc18afd7869318ac","name":"debug 153","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1170,"y":320,"wires":[]},{"id":"30739de5eaa89282","type":"debug","z":"fc18afd7869318ac","name":"debug 154","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1170,"y":800,"wires":[]},{"id":"7687a3a898660764","type":"evohome-config","name":"Thuis","userid":"m.r.j.","passwd":"2!"}]


Nadeel van deze api is wel dat ie maar op de halve graad nauwkeurig is, maar dat terzijde.

Tahoma_setpoint wordt als het goed is wel in dezelfde flow gezet. In functie lux switch. Zat deze er niet bij?

Acties:
  • +1 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
MikeyMan schreef op zaterdag 13 mei 2023 @ 21:40:
[...]
Nadeel van deze api is wel dat ie maar op de halve graad nauwkeurig is, maar dat terzijde.
Is dat waarom je die smooth nodes gebruikt?
Tahoma_setpoint wordt als het goed is wel in dezelfde flow gezet. In functie lux switch. Zat deze er niet bij?
Check. Die had ik even gemist.

Mocht je nog een voorbeeld hebben van de JSON die uit "Get Devices" komt, dan graag.

Wat is trouwens de reden dat je zowel een "EvoHome Domoticz" als een "EvoHome to MQTT" hebt? Waarbij de een waarden uit domoticz binnen krijgt en de ander via de EvoHome api, maar verder soort van hetzelfde lijken te zijn?

Ik ga ondertussen even puzzelen.

Feel free to Buy me a coffee


Acties:
  • +1 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

musicpixel schreef op zondag 14 mei 2023 @ 12:17:
[...]


Is dat waarom je die smooth nodes gebruikt?
Yup. Hij fluctueert weleens tussen die halve graden. Door het gebrek aan accuratesse.
[...]


Check. Die had ik even gemist.

Mocht je nog een voorbeeld hebben van de JSON die uit "Get Devices" komt, dan graag.
Yup, komt eraan.
Dit is de output:

code:
1
[{"deviceURL":"zigbee:\/\/2017-8871-5701\/0\/242","available":true,"synced":true,"type":5,"states":[],"label":"ZIGBEE (0\/242)","subsystemId":0,"attributes":[{"type":3,"name":"zigbee:Role","value":"coordinator"},{"type":1,"name":"zigbee:RadioChannel","value":20},{"type":3,"name":"core:MacAddress","value":"6DEO\/v8+ehg="}],"enabled":true,"controllableName":"zigbee:StackV3Component","definition":{"states":[{"name":"core:DiscreteRSSILevelState","rawStateId":"Rssi"},{"name":"core:RSSILevelState","rawStateId":"Rssi"},{"name":"core:ManufacturerNameState"},{"name":"core:ProductModelNameState"},{"name":"zigbee:LinkQualityIndicatorState","rawStateId":"Lqi"}],"widgetName":"ZigbeeStack","attributes":[{"name":"zigbee:Role"},{"name":"core:ManufacturerId"},{"name":"zigbee:RadioChannel"},{"name":"core:MacAddress"}],"uiClass":"ProtocolGateway","commands":[{"commandName":"openNetworkWithCommissioningManagement","nparams":0},{"commandName":"closeNetworkManagement","nparams":0},{"nparams":2,"commandName"...


Althans, deels... De debug node geeft niet meer weer...

De JSON Misschien dan?

code:
1
[{"deviceURL":"zigbee://2017-8871-5701/0/242","available":true,"synced":true,"type":5,"states":[],"label":"ZIGBEE (0/242)","subsystemId":0,"attributes":[{"type":3,"name":"zigbee:Role","value":"coordinator"},{"type":1,"name":"zigbee:RadioChannel","value":20},{"type":3,"name":"core:MacAddress","value":"6DEO/v8+ehg="}],"enabled":true,"controllableName":"zigbee:StackV3Component","definition":{"states":[{"name":"core:DiscreteRSSILevelState","rawStateId":"Rssi"},{"name":"core:RSSILevelState","rawStateId":"Rssi"},{"name":"core:ManufacturerNameState"},{"name":"core:ProductModelNameState"},{"name":"zigbee:LinkQualityIndicatorState","rawStateId":"Lqi"}],"widgetName":"ZigbeeStack","attributes":[{"name":"zigbee:Role"},{"name":"core:ManufacturerId"},{"name":"zigbee:RadioChannel"},{"name":"core:MacAddress"}],"uiClass":"ProtocolGateway","commands":[{"commandName":"openNetworkWithCommissioningManagement","nparams":0},{"commandName":"closeNetworkManagement","nparams":0},{"nparams":2,"commandName":"unbind","paramsSig":"p1,p2"},{"commandName":"refreshNetwork","nparams":0},{"nparams":1,"commandName":"openNetwork","paramsSig":"p1"},{"commandName":"closeNetwork","nparams":0},{"commandName":"openNetworkManagement","nparams":0},{"commandName":"bindingNetwork","nparams":0},{"nparams":2,"commandName":"bind","paramsSig":"p1,p2"}],"type":"PROTOCOL_GATEWAY"}},{"deviceURL":"zigbee://2017-8871-5701/0/1","available":true,"synced":true,"type":5,"states":[],"label":"ZIGBEE (0/1)","subsystemId":0,"attributes":[{"type":3,"name":"zigbee:Role","value":"coordinator"},{"type":1,"name":"zigbee:RadioChannel","value":20},{"type":3,"name":"core:MacAddress","value":"6DEO/v8+ehg="}],"enabled":true,"controllableName":"zigbee:StackV3Component","definition":{"states":[{"name":"core:DiscreteRSSILevelState","rawStateId":"Rssi"},{"name":"core:RSSILevelState","rawStateId":"Rssi"},{"name":"core:ManufacturerNameState"},{"name":"core:ProductModelNameState"},{"name":"zigbee:LinkQualityIndicatorState","rawStateId":"Lqi"}],"widgetName":"ZigbeeStack","attributes":[{"name":"zigbee:Role"},{"name":"core:ManufacturerId"},{"name":"zigbee:RadioChannel"},{"name":"core:MacAddress"}],"uiClass":"ProtocolGateway","commands":[{"commandName":"openNetworkWithCommissioningManagement","nparams":0},{"commandName":"closeNetworkManagement","nparams":0},{"nparams":2,"commandName":"unbind","paramsSig":"p1,p2"},{"commandName":"refreshNetwork","nparams":0},{"nparams":1,"commandName":"openNetwork","paramsSig":"p1"},{"commandName":"closeNetwork","nparams":0},{"commandName":"openNetworkManagement","nparams":0},{"commandName":"bindingNetwork","nparams":0},{"nparams":2,"commandName":"bind","paramsSig":"p1,p2"}],"type":"PROTOCOL_GATEWAY"}},{"deviceURL":"internal://2017-8871-5701/wifi/0","available":true,"synced":true,"type":1,"states":[{"type":1,"name":"internal:SignalStrengthState","value":93},{"type":3,"name":"internal:CurrentInfraConfigState","value":"ubnt"},{"type":3,"name":"internal:WifiModeState","value":"infrastructure"}],"label":"INTERNAL (wifi/0)","subsystemId":0,"attributes":[],"enabled":true,"controllableName":"internal:WifiComponent","definition":{"states":[{"name":"internal:CurrentInfraConfigState","rawStateId":"currentInfraConfig"},{"name":"internal:SignalStrengthState","rawStateId":"signalStrength"},{"name":"internal:WifiModeState","rawStateId":"mode"}],"widgetName":"Wifi","attributes":[],"uiClass":"Wifi","commands":[{"nparams":1,"commandName":"setWifiMode","paramsSig":"p1"},{"commandName":"clearCredentials","nparams":0},{"nparams":2,"commandName":"setTargetInfraConfig","paramsSig":"p1,p2"}],"type":"ACTUATOR"}},{"deviceURL":"io://2017-8871-5701/14384853","available":true,"synced":true,"type":2,"states":[{"type":3,"name":"core:DiscreteRSSILevelState","value":"normal"},{"type":1,"name":"core:RSSILevelState","value":60},{"type":1,"name":"core:LuminanceState","value":56448}],"label":"Verlichtingssensor achterkant","subsystemId":0,"attributes":[{"type":3,"name":"core:PowerSourceType","value":"battery"},{"type":3,"name":"core:FirmwareRevision","value":"5126936A15"},{"type":3,"name":"core:Manufacturer","value":"Somfy"}],"enabled":true,"controllableName":"io:LightIOSystemSensor","definition":{"states":[{"name":"core:StatusState","rawStateId":"2147426304"},{"name":"core:DiscreteRSSILevelState","rawStateId":"2146500638"},{"name":"core:RSSILevelState","rawStateId":"2146500638"},{"name":"core:LuminanceState","rawStateId":"2415919106"},{"name":"core:SensorDefectState","rawStateId":"2415919110"}],"widgetName":"LuminanceSensor","attributes":[{"name":"core:MaxSensedValue"},{"name":"core:PowerSourceType"},{"name":"core:MinSensedValue"},{"name":"core:MeasuredValueType"},{"name":"core:FirmwareRevision"},{"name":"core:Manufacturer"}],"uiClass":"LightSensor","commands":[{"nparams":1,"commandName":"advancedRefresh","paramsSig":"p1"}],"type":"SENSOR"}},{"deviceURL":"io://2017-8871-5701/3196925","available":true,"synced":true,"type":1,"states":[{"type":11,"name":"core:AdditionalStatusState","value":{"noKeyTransferSetupRequired":false}},{"type":11,"name":"core:ManufacturerSettingsState","value":{"current_position":51200}},{"type":1,"name":"core:ClosureState","value":100},{"type":3,"name":"core:OpenClosedState","value":"closed"},{"type":1,"name":"core:TargetClosureState","value":100},{"type":1,"name":"core:DeploymentState","value":100},{"type":3,"name":"core:NameState","value":"Zonwering Balkon"},{"type":3,"name":"core:StatusState","value":"available"},{"type":6,"name":"core:MovingState","value":false},{"type":3,"name":"core:DiscreteRSSILevelState","value":"normal"},{"type":1,"name":"core:RSSILevelState","value":42},{"type":1,"name":"core:Memorized1PositionState","value":105}],"label":"Zonwering Balkonraam","subsystemId":0,"attributes":[{"type":10,"name":"core:SupportedManufacturerSettingsCommands","value":["dead_man_up","dead_man_down","dead_man_stop","dead_man_impulse_up","dead_man_impulse_down","enter_settings_mode","save_upper_end_limit","save_lower_end_limit","stop_after_save_limit","save_settings","invert_rotation","save_my_position","delete_my_position","reset_actuator","double_power_cut","eject_from_setting_mode","enter_back_impulse_setting_mode","save_back_impulse_position"]},{"type":3,"name":"core:Manufacturer","value":"Somfy"},{"type":3,"name":"core:FirmwareRevision","value":"5104761X04"}],"enabled":true,"controllableName":"io:VerticalExteriorAwningIOComponent","definition":{"states":[{"name":"core:StatusState","rawStateId":"2147426304"},{"name":"core:NameState","rawStateId":"1"},{"name":"core:AdditionalStatusState","rawStateId":"2146500645"},{"name":"core:TargetClosureState","rawStateId":"16832522"},{"name":"core:SecuredPositionState","rawStateId":"16832522"},{"name":"core:ManufacturerSettingsState","rawStateId":"65537"},{"name":"core:ClosureState","rawStateId":"65537"},{"name":"core:OpenClosedState","rawStateId":"65537"},{"name":"core:DeploymentState","rawStateId":"65537"},{"name":"core:MovingState","rawStateId":"65557"},{"name":"core:ManufacturerDiagnosticsState","rawStateId":"2"},{"name":"core:DiscreteRSSILevelState","rawStateId":"2146500638"},{"name":"core:RSSILevelState","rawStateId":"2146500638"},{"name":"core:Memorized1PositionState","rawStateId":"16832512"}],"widgetName":"PositionableScreen","attributes":[{"name":"core:SupportedManufacturerSettingsCommands"},{"name":"core:Manufacturer"},{"name":"core:FirmwareRevision"}],"uiClass":"ExteriorScreen","commands":[{"commandName":"stop","nparams":0},{"nparams":1,"commandName":"setDeployment","paramsSig":"p1"},{"nparams":1,"commandName":"delayedStopIdentify","paramsSig":"p1"},{"nparams":2,"commandName":"runManufacturerSettingsCommand","paramsSig":"p1,p2"},{"commandName":"down","nparams":0},{"nparams":1,"commandName":"setClosure","paramsSig":"p1"},{"commandName":"unpairAllOneWayControllers","nparams":0},{"nparams":1,"commandName":"setConfigState","paramsSig":"p1"},{"nparams":1,"commandName":"pairOneWayController","paramsSig":"p1,*p2"},{"nparams":1,"commandName":"advancedRefresh","paramsSig":"p1,*p2"},{"commandName":"unpairAllOneWayControllersAndDeleteNode","nparams":0},{"commandName":"refreshMemorized1Position","nparams":0},{"commandName":"undeploy","nparams":0},{"commandName":"up","nparams":0},{"commandName":"startIdentify","nparams":0},{"commandName":"stopIdentify","nparams":0},{"commandName":"open","nparams":0},{"commandName":"deploy","nparams":0},{"commandName":"keepOneWayControllersAndDeleteNode","nparams":0},{"commandName":"sendIOKey","nparams":0},{"nparams":1,"commandName":"setMemorized1Position","paramsSig":"p1"},{"nparams":1,"commandName":"wink","paramsSig":"p1"},{"commandName":"close","nparams":0},{"nparams":1,"commandName":"setName","paramsSig":"p1"},{"commandName":"identify","nparams":0},{"nparams":1,"commandName":"setPosition","paramsSig":"p1"},{"nparams":1,"commandName":"unpairOneWayController","paramsSig":"p1,*p2"},{"nparams":1,"commandName":"setSecuredPosition","paramsSig":"p1"},{"commandName":"my","nparams":0},{"commandName":"getName","nparams":0}],"type":"ACTUATOR"}},{"creationTime":1682072545840,"deviceURL":"rts://2017-8871-5701/16736992","available":true,"synced":true,"type":1,"states":[],"label":"Zonwering woonkamer","definition":{"states":[],"widgetName":"UpDownExteriorScreen","attributes":[],"uiClass":"ExteriorScreen","commands":[{"nparams":0,"commandName":"stop","paramsSig":"*p1"},{"commandName":"test","nparams":0},{"nparams":0,"commandName":"open","paramsSig":"*p1"},{"nparams":0,"commandName":"close","paramsSig":"*p1"},{"commandName":"identify","nparams":0},{"nparams":0,"commandName":"up","paramsSig":"*p1"},{"nparams":0,"commandName":"down","paramsSig":"*p1"},{"nparams":0,"commandName":"my","paramsSig":"*p1"},{"nparams":0,"commandName":"openConfiguration","paramsSig":"*p1"},{"nparams":0,"commandName":"rest","paramsSig":"*p1"}],"type":"ACTUATOR"},"attributes":[],"enabled":true,"controllableName":"rts:ExteriorBlindRTSComponent","subsystemId":0},{"deviceURL":"internal://2017-8871-5701/pod/0","available":true,"synced":true,"type":1,"states":[{"type":3,"name":"core:NameState","value":"Box"},{"type":3,"name":"core:CountryCodeState","value":"NL"},{"type":1,"name":"internal:LightingLedPodModeState","value":0},{"type":3,"name":"core:LocalIPv4AddressState","value":"10.0.0.161"},{"type":3,"name":"core:ConnectivityState","value":"online"}],"label":"Box","subsystemId":0,"attributes":[],"enabled":true,"controllableName":"internal:PodV3Component","definition":{"states":[{"name":"core:ConnectivityState","rawStateId":"networkConnectivity"},{"name":"core:LocalAccessProofState","rawStateId":"localAccessProof"},{"name":"internal:Button2State","rawStateId":"button2"},{"name":"core:LocalIPv4AddressState","rawStateId":"ip"},{"name":"core:CountryCodeState","rawStateId":"countryCode"},{"name":"internal:Button3State","rawStateId":"button3"},{"name":"internal:LightingLedPodModeState","rawStateId":"lightingLedPodMode"},{"name":"core:NameState","rawStateId":"name"},{"name":"internal:Button1State","rawStateId":"button1"}],"widgetName":"Pod","attributes":[],"uiClass":"Pod","commands":[{"commandName":"deactivateCalendar","nparams":0},{"commandName":"refreshPodMode","nparams":0},{"commandName":"getName","nparams":0},{"commandName":"setPodLedOff","nparams":0},{"nparams":1,"commandName":"setCalendar","paramsSig":"p1"},{"commandName":"setPodLedOn","nparams":0},{"commandName":"activateCalendar","nparams":0},{"nparams":1,"commandName":"setLightingLedPodMode","paramsSig":"p1"},{"commandName":"update","nparams":0},{"commandName":"refreshUpdateStatus","nparams":0},{"nparams":1,"commandName":"setCountryCode","paramsSig":"p1"}],"type":"ACTUATOR"}},{"deviceURL":"io://2017-8871-5701/15149504","available":true,"synced":true,"type":5,"states":[],"label":"IO (15149504)","subsystemId":0,"attributes":[],"enabled":true,"controllableName":"io:StackComponent","definition":{"states":[],"widgetName":"IOStack","attributes":[],"uiClass":"ProtocolGateway","commands":[{"nparams":1,"commandName":"discoverActuators","paramsSig":"p1"},{"commandName":"joinNetwork","nparams":0},{"nparams":1,"commandName":"advancedSomfyDiscover","paramsSig":"p1"},{"commandName":"resetNetworkSecurity","nparams":0},{"commandName":"shareNetwork","nparams":0},{"nparams":0,"commandName":"discover1WayController","paramsSig":"*p1,*p2"},{"nparams":1,"commandName":"discoverSensors","paramsSig":"p1"},{"commandName":"discoverSomfyUnsetActuators","nparams":0}],"type":"PROTOCOL_GATEWAY"}},{"creationTime":1682072545612,"deviceURL":"rts://2017-8871-5701/16722109","available":true,"synced":true,"type":1,"states":[],"label":"Zonwering Slaapkamer","definition":{"states":[],"widgetName":"UpDownExteriorScreen","attributes":[],"uiClass":"ExteriorScreen","commands":[{"nparams":0,"commandName":"stop","paramsSig":"*p1"},{"commandName":"test","nparams":0},{"nparams":0,"commandName":"open","paramsSig":"*p1"},{"nparams":0,"commandName":"close","paramsSig":"*p1"},{"commandName":"identify","nparams":0},{"nparams":0,"commandName":"up","paramsSig":"*p1"},{"nparams":0,"commandName":"down","paramsSig":"*p1"},{"nparams":0,"commandName":"my","paramsSig":"*p1"},{"nparams":0,"commandName":"openConfiguration","paramsSig":"*p1"},{"nparams":0,"commandName":"rest","paramsSig":"*p1"}],"type":"ACTUATOR"},"attributes":[],"enabled":true,"controllableName":"rts:ExteriorBlindRTSComponent","subsystemId":0},{"creationTime":1682072546056,"deviceURL":"rts://2017-8871-5701/16740764","available":true,"synced":true,"type":1,"states":[],"label":"Zonwering keuken","definition":{"states":[],"widgetName":"UpDownExteriorScreen","attributes":[],"uiClass":"ExteriorScreen","commands":[{"nparams":0,"commandName":"stop","paramsSig":"*p1"},{"commandName":"test","nparams":0},{"nparams":0,"commandName":"open","paramsSig":"*p1"},{"nparams":0,"commandName":"close","paramsSig":"*p1"},{"commandName":"identify","nparams":0},{"nparams":0,"commandName":"up","paramsSig":"*p1"},{"nparams":0,"commandName":"down","paramsSig":"*p1"},{"nparams":0,"commandName":"my","paramsSig":"*p1"},{"nparams":0,"commandName":"openConfiguration","paramsSig":"*p1"},{"nparams":0,"commandName":"rest","paramsSig":"*p1"}],"type":"ACTUATOR"},"attributes":[],"enabled":true,"controllableName":"rts:ExteriorBlindRTSComponent","subsystemId":0},{"creationTime":1682072546227,"deviceURL":"rts://2017-8871-5701/16745695","available":true,"synced":true,"type":1,"states":[],"label":"Zonwering Gym","definition":{"states":[],"widgetName":"UpDownExteriorScreen","attributes":[],"uiClass":"ExteriorScreen","commands":[{"nparams":0,"commandName":"stop","paramsSig":"*p1"},{"commandName":"test","nparams":0},{"nparams":0,"commandName":"open","paramsSig":"*p1"},{"nparams":0,"commandName":"close","paramsSig":"*p1"},{"commandName":"identify","nparams":0},{"nparams":0,"commandName":"up","paramsSig":"*p1"},{"nparams":0,"commandName":"down","paramsSig":"*p1"},{"nparams":0,"commandName":"my","paramsSig":"*p1"},{"nparams":0,"commandName":"openConfiguration","paramsSig":"*p1"},{"nparams":0,"commandName":"rest","paramsSig":"*p1"}],"type":"ACTUATOR"},"attributes":[],"enabled":true,"controllableName":"rts:ExteriorBlindRTSComponent","subsystemId":0},{"deviceURL":"zigbee://2017-8871-5701/65535","available":true,"synced":true,"type":5,"states":[],"label":"ZIGBEE (65535)","subsystemId":0,"attributes":[],"enabled":true,"controllableName":"zigbee:TransceiverV3_0Component","definition":{"states":[],"widgetName":"ZigbeeStack","attributes":[],"uiClass":"ProtocolGateway","commands":[],"type":"PROTOCOL_GATEWAY"}},{"deviceURL":"io://2017-8871-5701/8684910","available":true,"synced":true,"type":1,"states":[{"type":6,"name":"core:MovingState","value":false},{"type":1,"name":"core:TargetClosureState","value":100},{"type":3,"name":"core:StatusState","value":"available"},{"type":1,"name":"core:Memorized1PositionState","value":105},{"type":3,"name":"core:NameState","value":"Zonwering Balkon"},{"type":11,"name":"core:ManufacturerSettingsState","value":{"current_position":51200}},{"type":1,"name":"core:ClosureState","value":100},{"type":3,"name":"core:OpenClosedState","value":"closed"},{"type":1,"name":"core:DeploymentState","value":100},{"type":3,"name":"core:DiscreteRSSILevelState","value":"normal"},{"type":1,"name":"core:RSSILevelState","value":42}],"label":"Zonwering Balkondeur","subsystemId":0,"attributes":[{"type":10,"name":"core:SupportedManufacturerSettingsCommands","value":["dead_man_up","dead_man_down","dead_man_stop","dead_man_impulse_up","dead_man_impulse_down","enter_settings_mode","save_upper_end_limit","save_lower_end_limit","stop_after_save_limit","save_settings","invert_rotation","save_my_position","delete_my_position","reset_actuator","double_power_cut","eject_from_setting_mode","enter_back_impulse_setting_mode","save_back_impulse_position"]},{"type":3,"name":"core:Manufacturer","value":"Somfy"},{"type":3,"name":"core:FirmwareRevision","value":"5104761X04"}],"enabled":true,"controllableName":"io:VerticalExteriorAwningIOComponent","definition":{"states":[{"name":"core:StatusState","rawStateId":"2147426304"},{"name":"core:NameState","rawStateId":"1"},{"name":"core:AdditionalStatusState","rawStateId":"2146500645"},{"name":"core:TargetClosureState","rawStateId":"16832522"},{"name":"core:SecuredPositionState","rawStateId":"16832522"},{"name":"core:ManufacturerSettingsState","rawStateId":"65537"},{"name":"core:ClosureState","rawStateId":"65537"},{"name":"core:OpenClosedState","rawStateId":"65537"},{"name":"core:DeploymentState","rawStateId":"65537"},{"name":"core:MovingState","rawStateId":"65557"},{"name":"core:ManufacturerDiagnosticsState","rawStateId":"2"},{"name":"core:DiscreteRSSILevelState","rawStateId":"2146500638"},{"name":"core:RSSILevelState","rawStateId":"2146500638"},{"name":"core:Memorized1PositionState","rawStateId":"16832512"}],"widgetName":"PositionableScreen","attributes":[{"name":"core:SupportedManufacturerSettingsCommands"},{"name":"core:Manufacturer"},{"name":"core:FirmwareRevision"}],"uiClass":"ExteriorScreen","commands":[{"commandName":"stop","nparams":0},{"nparams":1,"commandName":"setDeployment","paramsSig":"p1"},{"nparams":1,"commandName":"delayedStopIdentify","paramsSig":"p1"},{"nparams":2,"commandName":"runManufacturerSettingsCommand","paramsSig":"p1,p2"},{"commandName":"down","nparams":0},{"nparams":1,"commandName":"setClosure","paramsSig":"p1"},{"commandName":"unpairAllOneWayControllers","nparams":0},{"nparams":1,"commandName":"setConfigState","paramsSig":"p1"},{"nparams":1,"commandName":"pairOneWayController","paramsSig":"p1,*p2"},{"nparams":1,"commandName":"advancedRefresh","paramsSig":"p1,*p2"},{"commandName":"unpairAllOneWayControllersAndDeleteNode","nparams":0},{"commandName":"refreshMemorized1Position","nparams":0},{"commandName":"undeploy","nparams":0},{"commandName":"up","nparams":0},{"commandName":"startIdentify","nparams":0},{"commandName":"stopIdentify","nparams":0},{"commandName":"open","nparams":0},{"commandName":"deploy","nparams":0},{"commandName":"keepOneWayControllersAndDeleteNode","nparams":0},{"commandName":"sendIOKey","nparams":0},{"nparams":1,"commandName":"setMemorized1Position","paramsSig":"p1"},{"nparams":1,"commandName":"wink","paramsSig":"p1"},{"commandName":"close","nparams":0},{"nparams":1,"commandName":"setName","paramsSig":"p1"},{"commandName":"identify","nparams":0},{"nparams":1,"commandName":"setPosition","paramsSig":"p1"},{"nparams":1,"commandName":"unpairOneWayController","paramsSig":"p1,*p2"},{"nparams":1,"commandName":"setSecuredPosition","paramsSig":"p1"},{"commandName":"my","nparams":0},{"commandName":"getName","nparams":0}],"type":"ACTUATOR"}},{"deviceURL":"zigbee://2017-8871-5701/0/0","available":true,"synced":true,"type":6,"states":[{"type":3,"name":"core:StatusState","value":"available"}],"label":"ZIGBEE (0/0)","subsystemId":0,"attributes":[{"type":3,"name":"core:MacAddress","value":"6DEO/v8+ehg="}],"enabled":true,"controllableName":"zigbee:ZigbeeNetworkNode","definition":{"states":[{"name":"zigbee:RoutingTableState","rawStateId":"32818"},{"name":"zigbee:NeighborTableState","rawStateId":"32817"},{"name":"core:StatusState","rawStateId":"Available"},{"name":"zigbee:BindingTableState","rawStateId":"32819"}],"widgetName":"ZigbeeNetwork","attributes":[{"name":"core:MacAddress"},{"name":"core:CommissioningCode"}],"uiClass":"NetworkComponent","commands":[{"commandName":"refreshNeighborTable","nparams":0},{"commandName":"refreshRoutingTable","nparams":0},{"commandName":"refreshBindingTable","nparams":0},{"commandName":"leaveNetwork","nparams":0}],"type":"INFRASTRUCTURE_COMPONENT"}}]


Had ik al gezegd dat het een draak van een API is?
Wat is trouwens de reden dat je zowel een "EvoHome Domoticz" als een "EvoHome to MQTT" hebt? Waarbij de een waarden uit domoticz binnen krijgt en de ander via de EvoHome api, maar verder soort van hetzelfde lijken te zijn?

Ik ga ondertussen even puzzelen.
Had eerst domoticz aan de praat en pas later de api ontdekt. De domoticz input gebruikt nog de oude api. Die wel in tienden of zelfs honderdsten de temperatuur doorgeeft. Maar domoticz zelf loopt weleens vast, dus daarom omgezet naar de node red api.

Wat trouwens nog niet echt uitmaakt; omdat ik het nog niet voor elkaar heb om de schermen rechtstreeks via de API aan te sturen. Dus dat loopt ook nog via domoticz. :X

[ Voor 126% gewijzigd door MikeyMan op 14-05-2023 12:33 ]


Acties:
  • +1 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
@MikeyMan

Refactoring van je flows zal ik stap voor stap doen zodat je kunt volgen wat ik doe.

Uitgangspunten bij het herstructureren zijn o.a.:
- Dubbele code/nodes zoveel mogelijk verminderen. Dit helpt bij de onderhoudbaarheid.
- Nodes of flows die nu meerdere niet/half-gerelateerde dingen doen uit elkaar trekken zodat de nieuwe maar voor 1 ding verantwoordelijk zijn. Dit komt hergebruik ten goede.
- Harde waarden vervangen door variabelen zodat deze makkelijk kunnen worden aangepast indien nodig. Dit zorgt voor meer robuustheid en verbetert ook de leesbaarheid.
- En vast nog wel meer ;)

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

@musicpixel haha thanks! Is het zo erg? :+

Acties:
  • +1 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
MikeyMan schreef op zondag 14 mei 2023 @ 12:23:
[...]
Had ik al gezegd dat het een draak van een API is?
[...]
Eerste wat ik tegenkom:

Op dit moment haal je de status van ALLE devices op met de GetDevices node. Dat levert nogal een bak JSON op, wat extra load geeft op je gateway. Vervolgens haal je daar het 4e device uit, en daarvan weer de 3e state, wat dan de lux waarde is.

Probleem hiermee is dat het niet gegarandeerd het 4e device en de 3e state blijft. Dit kan bijvoorbeeld veranderen als er een device bij komt of er iets in de API gewijzigd wordt.

Heb je al geprobeerd om de status van ALLEEN de lichtsensor op te halen door de URL te veranderen van .../setup/devices naar .../setup/devices/{deviceURL}/states of zelfs .../setup/devices/{deviceURL}/states/{name}?

De lichtsensor heeft deviceURL "io://2017-8871-5701/14384853" en de name van de state is "core:LuminanceState" dus dan zou dat worden ("..." even vervangen door het eerste deel van jouw URL in je node):
code:
1
.../setup/devices/io%3A%2F%2F2017-8871-5701%2F14384853/states/core%3ALuminanceState


URLEncode wordt hier toegepast voor de deviceURL en name zoals in de Somfy Tahoma swagger-ui ook gedaan wordt.

Ik kan het helaas niet testen want heb geen Somfy spul, maar test-flowtje zou zoiets zijn. Laat even weten of dit werkt zodat ik hierop kan verder borduren.

Afbeeldingslocatie: https://tweakers.net/i/9ww3QSjPpK-o8JSOZBZMNkKrBCQ=/800x/filters:strip_icc():strip_exif()/f/image/9z5aEMVeaz7t9LK9FFj92NZF.jpg?f=fotoalbum_large

code:
1
[{"id":"0d4206cfbb99afbe","type":"inject","z":"59634d1e16095311","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":400,"y":760,"wires":[["e2291e974eac8bf7"]]},{"id":"e2291e974eac8bf7","type":"http request","z":"59634d1e16095311","name":"Get Lichtsensor State","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://10.0.0.161:8443/enduser-mobile-web/1/enduserAPI/setup/devices/io%3A%2F%2F2017-8871-5701%2F14384853/states/core%3ALuminanceState","tls":"930fdadf3d5bf745","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"bearer","senderr":false,"headers":[],"x":640,"y":760,"wires":[["f5886ed68cf93c12","39dddc71d36eb392"]]},{"id":"f5886ed68cf93c12","type":"json","z":"59634d1e16095311","name":"","property":"payload","action":"","pretty":false,"x":870,"y":760,"wires":[["b2adab4d4ce6e6b0"]]},{"id":"39dddc71d36eb392","type":"debug","z":"59634d1e16095311","name":"Lichtsensor State RAW","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":930,"y":700,"wires":[]},{"id":"b2adab4d4ce6e6b0","type":"debug","z":"59634d1e16095311","name":"Lichtsensor State Object","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1130,"y":760,"wires":[]},{"id":"930fdadf3d5bf745","type":"tls-config","name":"","cert":"","key":"","ca":"","certname":"","keyname":"","caname":"","servername":"","verifyservercert":false,"alpnprotocol":""}]


Ik neem aan dat je deze API links ook gevonden had?
https://github.com/Somfy-...mfy-TaHoma-Developer-Mode
https://github.com/Somfy-...ob/main/docs/openapi.yaml
https://somfy-developer.g...fy-TaHoma-Developer-Mode/

Feel free to Buy me a coffee


Acties:
  • +1 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
Gelukkig is het (met een beetje moeite) nog redelijk te volgen wat er gebeurt, maar kijkend naar je "Somfy Tahoma API" flow tabblad moest ik al snel hier aan denken, zeker met die lijntjes in Node Red ;)

Het feit dat je tegen problemen aanliep met de implementatie van "wind" betekende dat het waarschijnlijk te complex geworden was en er versimpeld/geherstructureerd moest worden. Dat is een normaal proces tijdens het programmeren.

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

@musicpixel dat flowtje deed het niet:
Afbeeldingslocatie: https://tweakers.net/i/L_UPC5_SSbSy0a3vVWr6Vf2A68o=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/MMcMJAVGlDztvwuO0uBNUNWO.png?f=user_large

gek genoeg met zelfde bearer token etc.


Heb de gok genomen, en de originele link vervangen en dat ziet er als volgt uit:

Afbeeldingslocatie: https://tweakers.net/i/STTk_sMXCiS48vzpbhsJeFtan3w=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/mh1pmv789krGYtfLnMvKavld.png?f=user_large

Ziet er volgens mij goed uit. :Y
Change node toegevoegd om msg.payload.value om te zetten naar msg.payload. En wat lijntjes omgehangen. Works like a charm.

Was er inderdaad al een keer tegenaan gelopen dat er blijkbaar iets veranderd was in de nummering. _/-\o_
Al lang blij dat er uberhaupt iets werkte eerlijk gezegd :)

Blijf het een dramatische implementatie vinden eerlijk gezegd. Lokale API met een tijdelijke bearer token. Why...?

[ Voor 55% gewijzigd door MikeyMan op 14-05-2023 20:18 ]


Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
MikeyMan schreef op zondag 14 mei 2023 @ 20:10:
@musicpixel dat flowtje deed het niet:
gek genoeg met zelfde bearer token etc.
Was er al bang voor dat er iets met de authenticatie niet goed zou overkomen.
Heb de gok genomen, en de originele link vervangen
Ziet er volgens mij goed uit. :Y
Change node toegevoegd om msg.payload.value om te zetten naar msg.payload. En wat lijntjes omgehangen. Works like a charm.
Gelukkig had ik het voldoende uitgelegd dus je kon het zelf aanpassen. Blij dat het werkt en goed dat ik de payload kan zien in je laatste afbeelding. Kan ik daar mee verder.
Was er inderdaad al een keer tegenaan gelopen dat er blijkbaar iets veranderd was in de nummering. _/-\o_
Al lang blij dat er uberhaupt iets werkte eerlijk gezegd :)
Ik zag in je originele flow dat je harde getallen gebruikte om een waarde uit een zooi JSON te halen en dacht meteen dat dat wel eens problemen kon geven, vandaar dat ik een voorbeeld van de JSON vroeg om het even te bekijken. Nu maar hopen dat de deviceURL wel gelijk blijft ;)
Blijf het een dramatische implementatie vinden eerlijk gezegd. Lokale API met een tijdelijke bearer token. Why...?
Ik vermoed dat het een (bijna) 1-op-1 kopie is van een Cloud API, kijkend naar hun swagger-ui implementatie.

Feel free to Buy me a coffee


Acties:
  • +1 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
@MikeyMan

Okee, had vandaag weer wat tijd, dus hier komt stap 1 van de refactoring.

STAP 1

Ik ben begonnen met het kijken naar de functie "Functie Woonkamer".

Afbeeldingslocatie: https://tweakers.net/i/hXMQkJDUnCAk6vTPLA7kKaxVX20=/800x/filters:strip_icc():strip_exif()/f/image/TGmQtA9vDx2etnQSJmVQXIf0.jpg?f=fotoalbum_large

Het viel me op dat deze functie meerdere dingen doet, namelijk
  • het bepalen van de domoticz commands om de woonkamer en keuken zonneschermen open of dicht te doen
  • het samenstellen van een statusbericht om te tonen op het dashboard en
  • het outputten van de temperatuur van de woonkamer om te tonen in een grafiek op het dashboard.
Dit ga ik hieronder uit elkaar trekken zodat de functie nog maar voor één ding verantwoordelijk is, namelijk het bepalen of de woonkamer/keuken zonneschemen open of dicht moeten (of dat er niets moet gebeuren).
De nieuwe functie krijgt dus maar één output, en die kan "open", "close", of "" zijn op basis van de logica die al in de huidige functie aanwezig is.

Tevens probeer ik te bewerkstelligen dat er een stuk minder kris-kras lijntjes zijn. In deze eerste stap zal dat nog niet heel zichtbaar zijn, maar wat ik nu in stap 1 doe is een voorbereiding hierop.

Alvast een plaatje en de export van hoe het er na stap 1 uit ziet:

Afbeeldingslocatie: https://tweakers.net/i/X33pLxLXKlS9-Ih7dXjeBBfT3qA=/800x/filters:strip_icc():strip_exif()/f/image/NK39Cc0YbWz4OKgQ52PdYGTi.jpg?f=fotoalbum_large

code:
1
[{"id":"76f463840671d95b","type":"function","z":"59634d1e16095311","name":"Zonnescherm Woonkamer Logica","func":"var Lichtsensor = msg.payload;\nLichtsensor = parseFloat(Lichtsensor.toFixed(0));\nvar Woonkamer_PV = global.get('EvoHome_woonkamer_PV', \"file\");\n// var Woonkamer_PVdec = parseFloat(Woonkamer_PV).toFixed(1);\nvar Woonkamer_SP = global.get('EvoHome_woonkamer_SP', \"file\");\n// var Woonkamer_SPdec = parseFloat(Woonkamer_SP).toFixed(1);\nlet Setpoint = global.get('Tahoma_setpoint', \"file\"); // Setpoint schermen uit;\nvar Switch = global.get('Switch.Woonkamer', \"file\"); //Schakeltemp woonkamer\nvar SwitchOpen = Switch-1;\n// var Switchdec = parseFloat(Switch).toFixed(1);\nlet OnOff = global.get('TahomaSwitch',\"file\");\nlet Wind_PV = global.get('Wind_PV', \"file\");\nlet Wind_SP = global.get('Wind.Woonkamer', \"file\")\n\n\nlet action = \"\";\nlet logicpath = 0;\n\nif (OnOff == true) {\n    if (Lichtsensor > Setpoint && Woonkamer_PV >= (Switch) && Wind_PV < Wind_SP) {\n        action = \"close\";\n        logicpath = 1;\n    }\n    else if (Lichtsensor > Setpoint && Woonkamer_PV >= (SwitchOpen) && Woonkamer_PV < Switch) {\n        action = \"\";\n        logicpath = 2;\n    }\n    else if (Lichtsensor > Setpoint && Woonkamer_PV < (SwitchOpen)) {\n        action = \"open\";\n        logicpath = 3;\n    }\n    else {\n        action = \"open\";\n        logicpath = 4;\n    }\n}\n\nmsg.payload = action;\nmsg.logicpath = logicpath;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":820,"y":820,"wires":[["9b97b6a610ecf1d9","f9258f0295134b2f","98b4f6f1954b9e69","444ca403c394f79e"]]},{"id":"8e8bc9fe64a517f7","type":"change","z":"59634d1e16095311","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"PV_Woonkamer","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1470,"y":1000,"wires":[["4b43aea169370583","f2a6fa288b9f1b39"]]},{"id":"a5af0c26964e592b","type":"mqtt out","z":"59634d1e16095311","name":"","topic":"domoticz/in","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"92e5b2c.00a8b5","x":1510,"y":840,"wires":[]},{"id":"9b97b6a610ecf1d9","type":"function","z":"59634d1e16095311","name":"Domoticz command Woonkamer","func":"var action = msg.payload;   // action can be \"open\", \"close\" or something else (eg. \"\")\n\nlet domoticzIdx = 492;  // zonnescherm woonkamer\nlet domoticzCommand = \"\";\n\n// determine domoticz command from action (open/close)\nswitch (action) {\n    case 'open':\n        domoticzCommand = { \"command\": \"switchlight\", \"idx\": domoticzIdx, \"switchcmd\": \"On\" };  // On = up\n        break;\n    case 'close':\n        domoticzCommand = { \"command\": \"switchlight\", \"idx\": domoticzIdx, \"switchcmd\": \"Off\" }; // Off = down\n        break;\n    default:\n        domoticzCommand = {};\n}\n\nmsg.payload = domoticzCommand;\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1210,"y":820,"wires":[["a5af0c26964e592b","d537b9469316c3e3"]]},{"id":"f9258f0295134b2f","type":"function","z":"59634d1e16095311","name":"Domoticz command Keuken","func":"var action = msg.payload;   // action can be \"open\", \"close\" or something else (eg. \"\")\n\nlet domoticzIdx = 493;  // zonnescherm keuken\nlet domoticzCommand = \"\";\n\n// determine domoticz command from action (open/close)\nswitch (action) {\n    case 'open':\n        domoticzCommand = { \"command\": \"switchlight\", \"idx\": domoticzIdx, \"switchcmd\": \"On\" };  // On = up\n        break;\n    case 'close':\n        domoticzCommand = { \"command\": \"switchlight\", \"idx\": domoticzIdx, \"switchcmd\": \"Off\" }; // Off = down\n        break;\n    default:\n        domoticzCommand = {};\n}\n\nmsg.payload = domoticzCommand;\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1200,"y":860,"wires":[["a5af0c26964e592b","87b1a3fad4083c68"]]},{"id":"98b4f6f1954b9e69","type":"function","z":"59634d1e16095311","name":"Prepare status message","func":"var action = msg.payload;       // action can be \"open\", \"close\" or something else (eg. \"\")\nvar logicpath = msg.logicpath;  // 1..4\nvar status = \"\";\n\nvar Woonkamer_PV = global.get('EvoHome_woonkamer_PV', \"file\");\nvar Woonkamer_SP = global.get('EvoHome_woonkamer_SP', \"file\");\nlet Wind_PV = global.get('Wind_PV', \"file\");\nlet Wind_SP = global.get('Wind.Woonkamer', \"file\")\nvar Switch = global.get('Switch.Woonkamer', \"file\"); //Schakeltemp woonkamer\nvar SwitchOpen = Switch - 1;\n\nvar Woonkamer_PVdec = parseFloat(Woonkamer_PV).toFixed(1);\nvar Woonkamer_SPdec = parseFloat(Woonkamer_SP).toFixed(1);\nvar Switchdec = parseFloat(Switch).toFixed(1);\n\n// determine domoticz command from action (open/close)\nswitch (action) {\n    case 'open':\n        status = \"In\"\n        break;\n    case 'close':\n        status = \"Uit\"\n        break;\n    default:\n        status = \"Hold\"\n}\n\nlet statusMessage = \"Status: \" + status + \" (\" + logicpath + \") - \" + \"Temp: \" + Woonkamer_PVdec + \" - Switch@:\" + Switchdec + \" - SwitchOpen\" + SwitchOpen + \" - Wind_PV:\" + Wind_PV + \" Wind_SP:\" + Wind_SP;\n\nmsg.payload = statusMessage;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1190,"y":960,"wires":[["69991cb20a29b17e"]]},{"id":"d537b9469316c3e3","type":"debug","z":"59634d1e16095311","name":"Debug zonnescherm Woonkamer Domoticz","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1610,"y":780,"wires":[]},{"id":"4b43aea169370583","type":"debug","z":"59634d1e16095311","name":"debug 192","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1690,"y":1040,"wires":[]},{"id":"ff6cad665b7daeac","type":"inject","z":"59634d1e16095311","name":"Lichtsensor dummy","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"22222","payloadType":"num","x":530,"y":820,"wires":[["76f463840671d95b"]]},{"id":"87b1a3fad4083c68","type":"debug","z":"59634d1e16095311","name":"Debug zonnescherm Keuken Domoticz","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1590,"y":900,"wires":[]},{"id":"444ca403c394f79e","type":"function","z":"59634d1e16095311","name":"Prepare graph value","func":"var Woonkamer_PV = global.get('EvoHome_woonkamer_PV', \"file\");\n\nmsg.payload = Woonkamer_PV;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1180,"y":1000,"wires":[["8e8bc9fe64a517f7"]]},{"id":"2caf20fc0f9e78a0","type":"ui_text","z":"59634d1e16095311","group":"cdd6bc3a70d5012e","order":3,"width":0,"height":0,"name":"","label":"Woonkamer","format":"{{msg.payload}}","layout":"row-spread","className":"","x":590,"y":1140,"wires":[]},{"id":"b874d5b31b2ad2dd","type":"link in","z":"59634d1e16095311","name":"Dashboard | Current State | Woonkamer","links":["69991cb20a29b17e","408d93a3edc8940e"],"x":435,"y":1140,"wires":[["2caf20fc0f9e78a0"]]},{"id":"69991cb20a29b17e","type":"link out","z":"59634d1e16095311","name":"Update Dashboard Current State Woonkamer","mode":"link","links":["b874d5b31b2ad2dd"],"x":1415,"y":960,"wires":[]},{"id":"bfe89eafea81c517","type":"ui_chart","z":"59634d1e16095311","name":"","group":"85e909c93386b7a6","order":1,"width":"14","height":"10","label":"Roomtemperature PV","chartType":"line","legend":"false","xformat":"HH:mm","interpolate":"linear","nodata":"","dot":false,"ymin":"10","ymax":"30","removeOlder":"24","removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":620,"y":1180,"wires":[["a2588b46222ede69"]]},{"id":"828c2195ec1dd210","type":"link in","z":"59634d1e16095311","name":"Dashboard | Chart Roomtemperature PV","links":["f2a6fa288b9f1b39","650f01eafc49c289"],"x":435,"y":1180,"wires":[["bfe89eafea81c517"]]},{"id":"a2588b46222ede69","type":"debug","z":"59634d1e16095311","name":"Roomtemperature PV Chart State","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":960,"y":1180,"wires":[]},{"id":"f2a6fa288b9f1b39","type":"link out","z":"59634d1e16095311","name":"Plot to Chart Roomtemperature PV","mode":"link","links":["828c2195ec1dd210"],"x":1635,"y":1000,"wires":[]},{"id":"bb35b611dc5e31f7","type":"comment","z":"59634d1e16095311","name":"Update Dashboard Current State Woonkamer","info":"","x":1650,"y":960,"wires":[]},{"id":"523e0ef0bd35591b","type":"comment","z":"59634d1e16095311","name":"Plot to Chart Roomtemperature PV","info":"","x":1840,"y":1000,"wires":[]},{"id":"92e5b2c.00a8b5","type":"mqtt-broker","name":"MQTT (NAS)","broker":"10.0.0.4","port":"1883","clientid":"Node_Red_Client","autoConnect":true,"usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"cdd6bc3a70d5012e","type":"ui_group","name":"Current State","tab":"21daaeaaf5421973","order":3,"disp":true,"width":"12","collapse":false,"className":""},{"id":"85e909c93386b7a6","type":"ui_group","name":"Chart","tab":"21daaeaaf5421973","order":4,"disp":true,"width":"28","collapse":false,"className":""},{"id":"21daaeaaf5421973","type":"ui_tab","name":"Zonneschermen","icon":"wi-wu-mostlysunny","order":14,"disabled":false,"hidden":false}]


Het lijkt zo op het eerste gezicht alsof het alleen maar meer wordt, maar heb geduld ;)

Allereerst: ik heb een lichtsensor dummy gebruikt om te testen, maar hier komt natuurlijk de lichtsensor output zoals je die nu al hebt in je flow.

Wat heb ik gedaan:

Dit was de inhoud van de OUDE function node Functie Woonkamer:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
var Lichtsensor = msg.payload;
Lichtsensor = parseFloat(Lichtsensor.toFixed(0));
var Woonkamer_PV = global.get('EvoHome_woonkamer_PV', "file");
var Woonkamer_PVdec = parseFloat(Woonkamer_PV).toFixed(1);
var Woonkamer_SP = global.get('EvoHome_woonkamer_SP', "file");
var Woonkamer_SPdec = parseFloat(Woonkamer_SP).toFixed(1);
let Setpoint = global.get('Tahoma_setpoint', "file"); // Setpoint schermen uit;
let msg1 = {};
let msg2 = {};
let msg3 = {};
let msg4 = {};
var Switch = global.get('Switch.Woonkamer', "file"); //Schakeltemp woonkamer
var SwitchOpen = Switch-1;
var Switchdec = parseFloat(Switch).toFixed(1);
let OnOff = global.get('TahomaSwitch',"file");
let Wind_PV = global.get('Wind_PV', "file");
let Wind_SP = global.get('Wind.Woonkamer', "file")

//msg.payload = { "Licht": Lichtsensor, "PV": Woonkamer_PV, "SP": Woonkamer_SP, "Setpoint": Setpoint };
if( OnOff == true){
if (Lichtsensor > Setpoint && Woonkamer_PV >= (Switch) && Wind_PV < Wind_SP) {
    msg1.payload = { "command": "switchlight", "idx": 492, "switchcmd": "Off" }; //Off = Down
    msg2.payload = { "command": "switchlight", "idx": 493, "switchcmd": "Off" }; //Off = Down
    msg3.payload = "Status: Uit (1) - " + "Temp: " + Woonkamer_PVdec + " - Switch@:" + Switchdec + " - SwitchOpen" + SwitchOpen + " - Wind_PV:" + Wind_PV + " Wind_SP:" + Wind_SP; //test
    //msg3.payload = { "Licht": Lichtsensor, "PV": Woonkamer_PV, "SP": Woonkamer_SP, "Setpoint": Setpoint, 'Switch@': Switch, 'OnOff': OnOff }; //test
    msg4.payload = Woonkamer_PV
}

else if (Lichtsensor > Setpoint && Woonkamer_PV >= (SwitchOpen) && Woonkamer_PV < Switch) {
    msg1.payload = null; //No message
    msg2.payload = null; //No message
    msg3.payload = "Status: Hold (2) - " + "Temp: " + Woonkamer_PVdec + " - Switch@:" + Switchdec + " - SwitchOpen" + SwitchOpen + " - Wind_PV:" + Wind_PV + " Wind_SP:" + Wind_SP;
    //msg2.payload = { "Licht": Lichtsensor, "PV": Woonkamer_PV, "SP": Slaapkamer_SP, "Setpoint": Setpoint, 'DT': Slaapkamer_DT, 'Switch@': Switch, 'OnOff': OnOff }; //test
    msg4.payload = Woonkamer_PV
}


else if (Lichtsensor > Setpoint && Woonkamer_PV < (SwitchOpen)) {
    msg1.payload = { "command": "switchlight", "idx": 492, "switchcmd": "On" }; //On = Up
    msg2.payload = { "command": "switchlight", "idx": 493, "switchcmd": "On" }; //On = Up
    msg3.payload = "Status: In (3) - " + "Temp: " + Woonkamer_PVdec + " - Switch@:" + Switchdec + " - SwitchOpen" + SwitchOpen + " - Wind_PV:" + Wind_PV + " Wind_SP:" + Wind_SP; //{ 'Switch@': Switch, 'Status': 'In' };
    //msg3.payload = { "Licht": Lichtsensor, "PV": Woonkamer_PV, "SP": Woonkamer_SP, "Setpoint": Setpoint, 'Switch@': Switch, 'OnOff': OnOff }; //test
    msg4.payload = Woonkamer_PV
}

else {
    msg1.payload = { "command": "switchlight", "idx": 492, "switchcmd": "On" }; //On = Up
    msg2.payload = { "command": "switchlight", "idx": 493, "switchcmd": "On" }; //On = Up
    msg3.payload = "Status: In (4) - " + "Temp: " + Woonkamer_PVdec + " - Switch@:" + Switchdec + " - SwitchOpen" + SwitchOpen + " - Wind_PV:" + Wind_PV + " Wind_SP:" + Wind_SP;
    //msg3.payload = { "Licht": Lichtsensor, "PV": Woonkamer_PV, "SP": Woonkamer_SP, "Setpoint": Setpoint, 'Switch@': Switch, 'OnOff': OnOff }; //test
    msg4.payload = Woonkamer_PV
}


return [msg1, msg2, msg3, msg4];
}


Allereerst heb ik een kopie gemaakt van de "Functie Woonkamer" node en deze hernoemd naar "Zonnescherm Woonkamer Logica". Daarin heb ik de volgende wijzigingen gemaakt.
  1. Ik heb bij elk if-blokje alles weggehaald en vervangen door de actie (action) die moet worden uitgevoerd: "open", "close", of "".
  2. Ik heb de msg1,2,3,4 vervangen door slechts 1 output, namelijk de action, in de msg.payload output.
  3. Omdat in de status message op het dashboard getoond moest worden welke van de 4 if's is uitgevoerd heb ik een logicpath toegevoegd, welke als msg.logicpath wordt ge-output.
  4. De variabelen aan het begin die niet meer worden gebruikt heb ik uitgecommentarieerd. Later gaan deze weg.
De inhoud van de NIEUWE function node Zonnescherm Woonkamer Logica welke de oude function node Functie Woonkamer moet gaan vervangen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
var Lichtsensor = msg.payload;
Lichtsensor = parseFloat(Lichtsensor.toFixed(0));
var Woonkamer_PV = global.get('EvoHome_woonkamer_PV', "file");
// var Woonkamer_PVdec = parseFloat(Woonkamer_PV).toFixed(1);
var Woonkamer_SP = global.get('EvoHome_woonkamer_SP', "file");
// var Woonkamer_SPdec = parseFloat(Woonkamer_SP).toFixed(1);
let Setpoint = global.get('Tahoma_setpoint', "file"); // Setpoint schermen uit;
var Switch = global.get('Switch.Woonkamer', "file"); //Schakeltemp woonkamer
var SwitchOpen = Switch-1;
// var Switchdec = parseFloat(Switch).toFixed(1);
let OnOff = global.get('TahomaSwitch',"file");
let Wind_PV = global.get('Wind_PV', "file");
let Wind_SP = global.get('Wind.Woonkamer', "file")


let action = "";
let logicpath = 0;

if (OnOff == true) {
    if (Lichtsensor > Setpoint && Woonkamer_PV >= (Switch) && Wind_PV < Wind_SP) {
        action = "close";
        logicpath = 1;
    }
    else if (Lichtsensor > Setpoint && Woonkamer_PV >= (SwitchOpen) && Woonkamer_PV < Switch) {
        action = "";
        logicpath = 2;
    }
    else if (Lichtsensor > Setpoint && Woonkamer_PV < (SwitchOpen)) {
        action = "open";
        logicpath = 3;
    }
    else {
        action = "open";
        logicpath = 4;
    }
}

msg.payload = action;
msg.logicpath = logicpath;

return msg;



Omdat deze nieuwe function node nu geen domoticz commands maakt en geen status messages meer formatteert, komt deze functionaliteit nu in aparte nodes rechts van de function node:
  • Een tweetal function nodes die een domoticz commando samenstellen gevolgd door een domoticz/in node (en debug nodes). Het was hiervoor niet nodig om enige informatie/variabelen te gebruiken uit de Logica-node, behalve dan de action.
  • Een "prepare status message" node die een bericht formatteert dat getoond wordt in het dashboard. Alle variabelen die hiervoor nodig zijn zitten al in globals, dus deze worden gewoon weer opgehaald met global.get. De enige die uit de Logic node worden gebruikt zijn de action en de logicpath.
  • Een "prepare graph value" node die de Woonkamer_PV waarde vanuit een global in de msg.payload zet zodat deze gebruikt kan worden in de chart op het dashboard.
Nog even een herhaling van het plaatje hiervan om het makkelijker te kunnen bekijken:
Afbeeldingslocatie: https://tweakers.net/i/X33pLxLXKlS9-Ih7dXjeBBfT3qA=/800x/filters:strip_icc():strip_exif()/f/image/NK39Cc0YbWz4OKgQ52PdYGTi.jpg?f=fotoalbum_large

Omdat bij het plaatsen van elke dashboard-node er ook een item in het dashboard verschijnt en ik geen dubbele items in het dashboard wil heb ik de dashboard nodes voor "Woonkamer" en "Roomtemperature PV" losgekoppeld en voorzien van een link-in node.
Vanuit de logica, of eigenlijk elke andere flow, kan ik nu een link-out node opnemen die het dashboard update zonder meerdere gelijke items in het dashboard te krijgen.
Zeker voor de Roomtemperature PV dashboard-node scheelt dat heel wat kris-kras lijntjes.

Dubbele items in het dashboard zijn niet de bedoeling:
Afbeeldingslocatie: https://tweakers.net/i/CybgwZONaUS4gkMe6I6WO68fWl8=/800x/filters:strip_icc():strip_exif()/f/image/Eo7SKyHCMzpBgji7gKzbGgFC.jpg?f=fotoalbum_large

LET OP dat ik tot nu alleen naar de Woonkamer heb gekeken. Ik laat expres de andere ruimtes nog even buiten beschouwing omdat deze er erg op lijken en ik anders alleen maar dubbel werk aan het doen ben. Zodra de Woonkamer is gerefactored doe ik pas de rest. Dit is dus een tussenfase en er zullen nog behoorlijk wat dingen wijzigen, ook in wat ik tot nu toe heb gedaan.

Stap 2 heb ik ook al klaar, deze volgt snel, dus wacht nog even met integreren en testen.
Je kunt het wel importeren in een nieuwe flow om alles even te bekijken.

Feel free to Buy me a coffee


Acties:
  • +1 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

@musicpixel wat een werk joh! Top man! Ga hem vanavond of morgen even importeren en bekijken.

Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

@musicpixel eindelijk genoeg tijd kunnen vinden om er eens beter naar te kijken. Lijkt erop dat mijn test opzetje toch al een klein beetje in de juiste richting was :+

Idealiter zou domoticz natuurlijk helemaal buiten beschouwing blijven. Tenminste; ik heb toch geregeld een vastloper of twee. Maar ben nog aan het klooien om de api rechtstreeks aan te sturen vanuit NodeRed. Lijken helaas weinig voorbeelden rond te zwerven nog.

Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
MikeyMan schreef op woensdag 24 mei 2023 @ 13:52:
@musicpixel eindelijk genoeg tijd kunnen vinden om er eens beter naar te kijken. Lijkt erop dat mijn test opzetje toch al een klein beetje in de juiste richting was :+
Bij mij liep het de afgelopen dagen ook een beetje anders dan verwacht ;)
Is jouw test-opzetje eigenlijk het gedeelte met "function Wind Test"?
Idealiter zou domoticz natuurlijk helemaal buiten beschouwing blijven. Tenminste; ik heb toch geregeld een vastloper of twee. Maar ben nog aan het klooien om de api rechtstreeks aan te sturen vanuit NodeRed. Lijken helaas weinig voorbeelden rond te zwerven nog.
Je had inderdaad al gezegd dat je domoticz wilde vervangen door een directe api aanroep. Dat heb ik meegenomen in de volgende stap. Niet dat ik domoticz al heb vervangen, maar heb het wel zo ingericht dat je nog maar op 1 plek die domoticz aanroep hoeft te vervangen door die andere api. Zie hieronder:

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

@musicpixel Yes, inderdaad het stukje wind test naar gym test :)
Eerste poging het uit elkaar te trekken.

Acties:
  • +1 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
@MikeyMan

STAP 2 van de refactoring

Deze stap borduurt verder op stap 1. In de vorige stap werden nog functies gebruikt om de domoticz commando's op te bouwen om vervolgens de domoticz/in node aan te roepen. Het opbouwen van deze domoticz commando's gebeurt op diverse plekken, terwijl de structuur van zo'n domoticz commando steeds hetzelfde is. Ik kwam deze domoticz commando's ook nog tegen bij het aan/uit schakelen van de diverse switches in het dashboard. Zie hieronder:

Afbeeldingslocatie: https://tweakers.net/i/l5xDB-R0fvmawmeVGHk3HkohomY=/800x/filters:strip_icc():strip_exif()/f/image/q8cEbldxzlWtSEIBprjMdEqm.jpg?f=fotoalbum_large

Wat heb ik gedaan:

Ik heb een subflow "Zonnescherm Service" gemaakt welke op basis van de naam van het zonnescherm (woonkamer, keuken, slaapkamer, gym, balkonraam, balkondeur) en de actie (open, close) het juiste domoticz commando samenstelt en uitvoert.

Afbeeldingslocatie: https://tweakers.net/i/VcVQ-Oh0aF33QIVsA9Qb5XvMx2U=/800x/filters:strip_icc():strip_exif()/f/image/YXVSWJkCOJGgKS4wze3dV5Dl.jpg?f=fotoalbum_large

Gebruik van deze sublow gaat als volgt:
  1. Zet de juiste input parameters (msg.param.*)
  2. Roep de subflow aan
Wil je later de domoticz besturing van de zonneschermen vervangen door de andere api, dan hoef je alleen de subflow aan te passen.

Het is overigens ook mogelijk om gebruik te maken van subflow instance properties/environment variables bij het aanroepen van de subflow, maar dat heb ik hier niet geimplementeerd aangezien deze alleen hardcoded kunnen worden meegegeven, itt variabelen in de msg.

Ik heb ook geen gebruik gemaakt van link in/out/call nodes. Voor de verschillen met een subflow, zie hier.

Hieronder hoe dit er dan uit komt te zien, weer even alleen voor de Woonkamer:

Afbeeldingslocatie: https://tweakers.net/i/L3EXULdUPaES9XqeUvWfJafnxXU=/800x/filters:strip_icc():strip_exif()/f/image/KoUb74sSf0tAUUMtM7ugO08J.jpg?f=fotoalbum_large

code:
1
[{"id":"090dd6fdbc576709","type":"subflow","name":"Zonnescherm service","info":"","category":"","in":[{"x":200,"y":160,"wires":[{"id":"c6b546347ee6d969"}]}],"out":[],"env":[],"meta":{},"color":"#DDAA99"},{"id":"c6b546347ee6d969","type":"function","z":"090dd6fdbc576709","name":"Determine Domoticz  idx","func":"let idx = 0;\nlet name = msg.param.name.toLowerCase();\n\nmsg.domoticz = {};  // set to empty object\n\n// determine idx from name\nswitch(name)\n{\n    case 'woonkamer':\n        idx = 492;\n        break;\n    case 'keuken':\n        idx = 493;\n        break;\n    case 'slaapkamer':\n        idx = 494;\n        break;\n    case 'gym':\n        idx = 495;\n        break;\n    case 'balkonraam':\n        idx = 496;\n        break;\n    case 'balkondeur':\n        idx = 497;\n        break;\n    default:\n        idx = 0;\n}\n\nmsg.domoticz.idx = idx;\n\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":410,"y":160,"wires":[["cae55095c0708857"]]},{"id":"cc1e0a59a31de086","type":"function","z":"090dd6fdbc576709","name":"Create Domoticz command","func":"let domoticzIdx = msg.domoticz.idx;\nlet domoticzAction = msg.domoticz.action;\n\nlet domoticzCommand = {};\n\nif (domoticzIdx > 0 && domoticzAction != \"\")\n    domoticzCommand = { \"command\": \"switchlight\", \"idx\": domoticzIdx, \"switchcmd\": domoticzAction };\n\nmsg.payload = domoticzCommand;\n\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1040,"y":160,"wires":[["3ec05468283aa74b","6a07c909e8a69cb8"]]},{"id":"3ec05468283aa74b","type":"debug","z":"090dd6fdbc576709","name":"Zonnescherm service","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1360,"y":200,"wires":[]},{"id":"965eb1d3875b8db7","type":"comment","z":"090dd6fdbc576709","name":"msg.param.name => naam zonnescherm","info":"","x":340,"y":60,"wires":[]},{"id":"6a07c909e8a69cb8","type":"mqtt out","z":"090dd6fdbc576709","name":"","topic":"domoticz/in","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"92e5b2c.00a8b5","x":1330,"y":160,"wires":[]},{"id":"89c082c74e068f2e","type":"comment","z":"090dd6fdbc576709","name":" msg.param.action => uit te voeren actie (open/close)","info":"","x":370,"y":100,"wires":[]},{"id":"cae55095c0708857","type":"function","z":"090dd6fdbc576709","name":"Determine Domoticz action","func":"let action = msg.param.action.toLowerCase();\n\nlet domoticzAction = \"\";\n\n// determine domoticz action (switchcmd) from action parameter (open/close)\nswitch(action)\n{\n    case 'open':\n        domoticzAction = \"On\";  // up\n        break;\n    case 'close':\n        domoticzAction = \"Off\"; // down\n        break;\n    default:\n        domoticzAction = \"\";\n}\n\nmsg.domoticz.action = domoticzAction;    \n\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":720,"y":160,"wires":[["cc1e0a59a31de086"]]},{"id":"92e5b2c.00a8b5","type":"mqtt-broker","name":"MQTT (NAS)","broker":"10.0.0.4","port":"1883","clientid":"Node_Red_Client","autoConnect":true,"usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"092c9cfaa8bf1fe6","type":"inject","z":"59634d1e16095311","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":500,"y":680,"wires":[["3aa9c57de79c4e42"]]},{"id":"3aa9c57de79c4e42","type":"change","z":"59634d1e16095311","name":"Zonnescherm param: Keuken, close","rules":[{"t":"set","p":"param.name","pt":"msg","to":"keuken","tot":"str"},{"t":"set","p":"param.action","pt":"msg","to":"close","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":770,"y":680,"wires":[["71653c0c129ce6b2"]]},{"id":"71653c0c129ce6b2","type":"subflow:090dd6fdbc576709","z":"59634d1e16095311","name":"","x":1080,"y":680,"wires":[]},{"id":"8a83a9909c0f22a0","type":"function","z":"59634d1e16095311","name":"Zonnescherm Woonkamer Logica","func":"var Lichtsensor = msg.payload;\nLichtsensor = parseFloat(Lichtsensor.toFixed(0));\nvar Woonkamer_PV = global.get('EvoHome_woonkamer_PV', \"file\");\n// var Woonkamer_PVdec = parseFloat(Woonkamer_PV).toFixed(1);\nvar Woonkamer_SP = global.get('EvoHome_woonkamer_SP', \"file\");\n// var Woonkamer_SPdec = parseFloat(Woonkamer_SP).toFixed(1);\nlet Setpoint = global.get('Tahoma_setpoint', \"file\"); // Setpoint schermen uit;\nvar Switch = global.get('Switch.Woonkamer', \"file\"); //Schakeltemp woonkamer\nvar SwitchOpen = Switch-1;\n// var Switchdec = parseFloat(Switch).toFixed(1);\nlet OnOff = global.get('TahomaSwitch',\"file\");\nlet Wind_PV = global.get('Wind_PV', \"file\");\nlet Wind_SP = global.get('Wind.Woonkamer', \"file\")\n\n\nlet action = \"\";\nlet logicpath = 0;\n\nif (OnOff == true) {\n    if (Lichtsensor > Setpoint && Woonkamer_PV >= (Switch) && Wind_PV < Wind_SP) {\n        action = \"close\";\n        logicpath = 1;\n    }\n    else if (Lichtsensor > Setpoint && Woonkamer_PV >= (SwitchOpen) && Woonkamer_PV < Switch) {\n        action = \"\";\n        logicpath = 2;\n    }\n    else if (Lichtsensor > Setpoint && Woonkamer_PV < (SwitchOpen)) {\n        action = \"open\";\n        logicpath = 3;\n    }\n    else {\n        action = \"open\";\n        logicpath = 4;\n    }\n}\n\nmsg.payload = action;\nmsg.logicpath = logicpath;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":820,"y":860,"wires":[["e5b21bbacb5f1416","acad955c5f7c4c51","1fc4019443108cf8","ff732513666f0516"]]},{"id":"01724239939ed973","type":"change","z":"59634d1e16095311","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"PV_Woonkamer","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1470,"y":1040,"wires":[["8428dfc36d4b8c9c","650f01eafc49c289"]]},{"id":"e5b21bbacb5f1416","type":"function","z":"59634d1e16095311","name":"Prepare status message","func":"var action = msg.payload;       // action can be \"open\", \"close\" or something else (eg. \"\")\nvar logicpath = msg.logicpath;  // 1..4\nvar status = \"\";\n\nvar Woonkamer_PV = global.get('EvoHome_woonkamer_PV', \"file\");\nvar Woonkamer_SP = global.get('EvoHome_woonkamer_SP', \"file\");\nlet Wind_PV = global.get('Wind_PV', \"file\");\nlet Wind_SP = global.get('Wind.Woonkamer', \"file\")\nvar Switch = global.get('Switch.Woonkamer', \"file\"); //Schakeltemp woonkamer\nvar SwitchOpen = Switch - 1;\n\nvar Woonkamer_PVdec = parseFloat(Woonkamer_PV).toFixed(1);\nvar Woonkamer_SPdec = parseFloat(Woonkamer_SP).toFixed(1);\nvar Switchdec = parseFloat(Switch).toFixed(1);\n\n// determine domoticz command from action (open/close)\nswitch (action) {\n    case 'open':\n        status = \"In\"\n        break;\n    case 'close':\n        status = \"Uit\"\n        break;\n    default:\n        status = \"Hold\"\n}\n\nlet statusMessage = \"Status: \" + status + \" (\" + logicpath + \") - \" + \"Temp: \" + Woonkamer_PVdec + \" - Switch@:\" + Switchdec + \" - SwitchOpen\" + SwitchOpen + \" - Wind_PV:\" + Wind_PV + \" Wind_SP:\" + Wind_SP;\n\nmsg.payload = statusMessage;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1190,"y":1000,"wires":[["408d93a3edc8940e"]]},{"id":"8428dfc36d4b8c9c","type":"debug","z":"59634d1e16095311","name":"debug 194","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1690,"y":1080,"wires":[]},{"id":"199627d1c8c1be3d","type":"inject","z":"59634d1e16095311","name":"Lichtsensor dummy","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"22222","payloadType":"num","x":530,"y":860,"wires":[["8a83a9909c0f22a0"]]},{"id":"acad955c5f7c4c51","type":"function","z":"59634d1e16095311","name":"Prepare graph value","func":"var Woonkamer_PV = global.get('EvoHome_woonkamer_PV', \"file\");\n\nmsg.payload = Woonkamer_PV;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1180,"y":1040,"wires":[["01724239939ed973"]]},{"id":"2caf20fc0f9e78a0","type":"ui_text","z":"59634d1e16095311","group":"cdd6bc3a70d5012e","order":3,"width":0,"height":0,"name":"","label":"Woonkamer","format":"{{msg.payload}}","layout":"row-spread","className":"","x":590,"y":1180,"wires":[]},{"id":"b874d5b31b2ad2dd","type":"link in","z":"59634d1e16095311","name":"Dashboard | Current State | Woonkamer","links":["69991cb20a29b17e","408d93a3edc8940e"],"x":435,"y":1180,"wires":[["2caf20fc0f9e78a0"]]},{"id":"408d93a3edc8940e","type":"link out","z":"59634d1e16095311","name":"Update Dashboard Current State Woonkamer","mode":"link","links":["b874d5b31b2ad2dd"],"x":1415,"y":1000,"wires":[]},{"id":"bfe89eafea81c517","type":"ui_chart","z":"59634d1e16095311","name":"","group":"85e909c93386b7a6","order":1,"width":"14","height":"10","label":"Roomtemperature PV","chartType":"line","legend":"false","xformat":"HH:mm","interpolate":"linear","nodata":"","dot":false,"ymin":"10","ymax":"30","removeOlder":"24","removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":620,"y":1220,"wires":[["a2588b46222ede69"]]},{"id":"828c2195ec1dd210","type":"link in","z":"59634d1e16095311","name":"Dashboard | Chart Roomtemperature PV","links":["f2a6fa288b9f1b39","650f01eafc49c289"],"x":435,"y":1220,"wires":[["bfe89eafea81c517"]]},{"id":"a2588b46222ede69","type":"debug","z":"59634d1e16095311","name":"Roomtemperature PV Chart State","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":960,"y":1220,"wires":[]},{"id":"650f01eafc49c289","type":"link out","z":"59634d1e16095311","name":"Plot to Chart Roomtemperature PV","mode":"link","links":["828c2195ec1dd210"],"x":1635,"y":1040,"wires":[]},{"id":"19f14c6eedc8f55a","type":"comment","z":"59634d1e16095311","name":"Update Dashboard Current State Woonkamer","info":"","x":1650,"y":1000,"wires":[]},{"id":"b43c46f364e6f3a4","type":"comment","z":"59634d1e16095311","name":"Plot to Chart Roomtemperature PV","info":"","x":1840,"y":1040,"wires":[]},{"id":"2c0c5353a14b21b4","type":"change","z":"59634d1e16095311","name":"Zonnescherm param: Woonkamer, open","rules":[{"t":"set","p":"param.name","pt":"msg","to":"woonkamer","tot":"str"},{"t":"set","p":"param.action","pt":"msg","to":"open","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":780,"y":720,"wires":[["5b9a9e22c2977b26"]]},{"id":"aeb2ed38eaec4ad5","type":"inject","z":"59634d1e16095311","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":500,"y":720,"wires":[["2c0c5353a14b21b4"]]},{"id":"5b9a9e22c2977b26","type":"subflow:090dd6fdbc576709","z":"59634d1e16095311","name":"","x":1080,"y":720,"wires":[]},{"id":"1fc4019443108cf8","type":"change","z":"59634d1e16095311","name":"Zonnescherm Keuken params","rules":[{"t":"set","p":"param.name","pt":"msg","to":"keuken","tot":"str"},{"t":"set","p":"param.action","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1210,"y":900,"wires":[["3e570e0c3da9d0c3"]]},{"id":"3e570e0c3da9d0c3","type":"subflow:090dd6fdbc576709","z":"59634d1e16095311","name":"","x":1540,"y":900,"wires":[]},{"id":"ff732513666f0516","type":"change","z":"59634d1e16095311","name":"Zonnescherm Woonkamer params","rules":[{"t":"set","p":"param.name","pt":"msg","to":"woonkamer","tot":"str"},{"t":"set","p":"param.action","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1220,"y":860,"wires":[["e93ee793279cd83d"]]},{"id":"e93ee793279cd83d","type":"subflow:090dd6fdbc576709","z":"59634d1e16095311","name":"","x":1540,"y":860,"wires":[]},{"id":"70d3b80ab7c22c65","type":"ui_switch","z":"59634d1e16095311","name":"","label":"Woonkamer","tooltip":"","group":"a2e65bc36447190d","order":1,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"topic","topicType":"msg","style":"","onvalue":"close","onvalueType":"str","onicon":"","oncolor":"","offvalue":"open","offvalueType":"str","officon":"","offcolor":"","animate":false,"className":"","x":490,"y":1340,"wires":[["00bc96b6592c0efa"]]},{"id":"6bf3945b4d8e6271","type":"comment","z":"59634d1e16095311","name":"open = up = domoticz On = dashboard switch off","info":"","x":1540,"y":1340,"wires":[]},{"id":"66635b95a8124474","type":"comment","z":"59634d1e16095311","name":"close = down = domoticz Off = dashboard switch on","info":"","x":1550,"y":1380,"wires":[]},{"id":"00bc96b6592c0efa","type":"change","z":"59634d1e16095311","name":"Zonnescherm Woonkamer params","rules":[{"t":"set","p":"param.name","pt":"msg","to":"woonkamer","tot":"str"},{"t":"set","p":"param.action","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":800,"y":1340,"wires":[["a90ef4b3775a659e"]]},{"id":"a90ef4b3775a659e","type":"subflow:090dd6fdbc576709","z":"59634d1e16095311","name":"","x":1140,"y":1340,"wires":[]},{"id":"29406aa951fd0e26","type":"comment","z":"59634d1e16095311","name":"Zonnescherm service test","info":"","x":530,"y":640,"wires":[]},{"id":"c56f64f946f1b76a","type":"comment","z":"59634d1e16095311","name":"Zonnescherm service aanroep obv logica","info":"","x":580,"y":820,"wires":[]},{"id":"92e8351d2a132569","type":"comment","z":"59634d1e16095311","name":"Zonnescherm service aanroep obv switch in dashboard","info":"","x":620,"y":1300,"wires":[]},{"id":"766122cb7bb53d4f","type":"comment","z":"59634d1e16095311","name":"Voorbeeld dashboard waarden","info":"","x":550,"y":1140,"wires":[]},{"id":"cdd6bc3a70d5012e","type":"ui_group","name":"Current State","tab":"21daaeaaf5421973","order":3,"disp":true,"width":"12","collapse":false,"className":""},{"id":"85e909c93386b7a6","type":"ui_group","name":"Chart","tab":"21daaeaaf5421973","order":4,"disp":true,"width":"28","collapse":false,"className":""},{"id":"a2e65bc36447190d","type":"ui_group","name":"Control","tab":"21daaeaaf5421973","order":2,"disp":true,"width":"6","collapse":false,"className":""},{"id":"21daaeaaf5421973","type":"ui_tab","name":"Zonneschermen","icon":"wi-wu-mostlysunny","order":14,"disabled":false,"hidden":false}]

(Deze code bevat ook de subflow)

A) Dit zijn twee simpele test-flowtjes om de subflow te kunnen uitproberen, los van de rest van de automatiseringen.

B en C) Zelfde als de flow uit stap 1, maar nu met de subflow

D) Een voorbeeld van de Woonkamer switch uit het dashboard. Ik heb hierbij wel de "on" en "off" payload instelling aangepast:
Afbeeldingslocatie: https://tweakers.net/i/43Iu5CQt97kiW6HcczsFtUXPlq8=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/3IC8Rt00vRZfgj4UBcjhjQKZ.jpg?f=user_large
Op deze manier kon ik de output daarvan direct gebruiken voor de aanroep van de subflow.

Ook bij deze stap geldt: ik zou 'm even importeren in een nieuw flow tabblad om 'm te bekijken, maar nog niet helemaal integreren in je bestaande flows. Er gaat nog het een en ander veranderen.

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

@musicpixel Ok, nu gaat het ineens hard. Moet hier echt even in duiken. Subflows lijken me voor en nadelen hebben. Eens even kijken hoe dat gaat :)

Overigens nog een leuk geintje met die API.

De token verloopt blijkbaar een keer in de zoveel tijd. Dan is het nieuwe token aanmaken en activeren.
Vind het echt zo'n baggeroplossing. :X

[ Voor 39% gewijzigd door MikeyMan op 26-05-2023 15:06 ]


Acties:
  • 0 Henk 'm!

  • FrankJ91
  • Registratie: September 2010
  • Laatst online: 21-09 00:21
ray1979 schreef op zaterdag 13 mei 2023 @ 11:38:
[...]


Deze flow ziet er perfect uit. Heb je deze nog actief? Zo ja, zou je de code hier willen delen? Zou een perfect startpunt voor mijn automatisering zijn.
Sorry voor mijn late bericht, nee helaas draait deze niet meer en heb de code niet meer. Uiteindelijk ging het scherm te vaak open en dicht ermee en op sommige momenten kon het nog steeds fel weer buiten zijn terwijl het scherm bijvoorbeeld gewoon weer open ging. Het finetunen lukte me gewoonweg niet perfect dus ik doe het weer ouderwets met de hand :p

Wellicht dat ik nog een keer kijk naar een combinatie van een lokale weerstation en een lichtsensor achter de screen zelf.

Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
MikeyMan schreef op vrijdag 26 mei 2023 @ 13:57:
@musicpixel Ok, nu gaat het ineens hard. Moet hier echt even in duiken. Subflows lijken me voor en nadelen hebben. Eens even kijken hoe dat gaat :)
Hoop dat je er een beetje uit komt met de subflow. Is niet super ingewikkeld denk ik. De linkjes in mijn post zouden moeten helpen om het te begrijpen.
Overigens nog een leuk geintje met die API.

De token verloopt blijkbaar een keer in de zoveel tijd. Dan is het nieuwe token aanmaken en activeren.
Vind het echt zo'n baggeroplossing. :X
Voor zover ik de API documentatie begrijp zou het mogelijk moeten zijn om automatisch een nieuw token op te vragen. Maar is nogal lastig om te testen voor mij zonder toegang tot het apparaat in kwestie ;)

Nog wel een vraagje over wat ik zie in je "function Wind Test"... begrijp ik goed dat je 3 verschillende soorten zonwering hebt (woonkamer/standaard, screens en zipscreens)? En dat per soort zonwering er een andere max windbelasting is? Is dat wat je hier probeert te doen?

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

musicpixel schreef op maandag 29 mei 2023 @ 08:44:
[...]


Hoop dat je er een beetje uit komt met de subflow. Is niet super ingewikkeld denk ik. De linkjes in mijn post zouden moeten helpen om het te begrijpen.


[...]


Voor zover ik de API documentatie begrijp zou het mogelijk moeten zijn om automatisch een nieuw token op te vragen. Maar is nogal lastig om te testen voor mij zonder toegang tot het apparaat in kwestie ;)

Nog wel een vraagje over wat ik zie in je "function Wind Test"... begrijp ik goed dat je 3 verschillende soorten zonwering hebt (woonkamer/standaard, screens en zipscreens)? En dat per soort zonwering er een andere max windbelasting is? Is dat wat je hier probeert te doen?
Correct!

Woonkamer heeft uitvalschermen.
Eerste verdieping ouderwetse screens.
Tweede verdieping zipscreens.

Moet er nog een stel gaan vervangen, maar dat kost uiteraard een godsvermogen.

Acties:
  • 0 Henk 'm!

  • ray1979
  • Registratie: April 2006
  • Laatst online: 19-09 12:15
FrankJ91 schreef op zondag 28 mei 2023 @ 23:19:
[...]


Sorry voor mijn late bericht, nee helaas draait deze niet meer en heb de code niet meer. Uiteindelijk ging het scherm te vaak open en dicht ermee en op sommige momenten kon het nog steeds fel weer buiten zijn terwijl het scherm bijvoorbeeld gewoon weer open ging. Het finetunen lukte me gewoonweg niet perfect dus ik doe het weer ouderwets met de hand :p

Wellicht dat ik nog een keer kijk naar een combinatie van een lokale weerstation en een lichtsensor achter de screen zelf.
Dank voor je reactie. Ik herken het probleem dat je noemt wel. Met 13 zonneschermen op 4 verschillende gevels ben ik echter wel zo ver dat handmatige bediening geen lolletje meer is. Ik heb het uiteindelijk op deze manier opgelost. Na wat tunen van de parameters ben ik nu redelijk tevreden. Even kijken hoe het de komende weken gaat...

Afbeeldingslocatie: https://tweakers.net/i/EPoFLskIrrNLjGGsfjI44H0AXiA=/800x/filters:strip_exif()/f/image/UHShUgAkj1XcKdWrra0Npolr.png?f=fotoalbum_large

code:
1
[{"id":"d4683cb00fc074f4","type":"tab","label":"Sunscreens","disabled":false,"info":"","env":[]},{"id":"32cb62246676a2e2","type":"inject","z":"d4683cb00fc074f4","name":"","props":[{"p":"payload"}],"repeat":"120","crontab":"","once":true,"onceDelay":"1","topic":"","payload":"","payloadType":"date","x":130,"y":320,"wires":[["8079e9af5b6c4830"]]},{"id":"54bef888c3f3782a","type":"comment","z":"d4683cb00fc074f4","name":"https://www.suncalc.org","info":"https://www.suncalc.org/#/0.0000,0.0000/2023.05.13/09:39/1/1","x":1000,"y":100,"wires":[]},{"id":"305b07639a24ec54","type":"api-call-service","z":"d4683cb00fc074f4","name":"Close N-O (weg-zijde)","server":"c7b344be.584158","version":5,"debugenabled":false,"domain":"cover","service":"close_cover","areaId":[],"deviceId":[],"entityId":["cover.screens_noordoost"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1480,"y":80,"wires":[[]],"icon":"font-awesome/fa-angle-double-down"},{"id":"3d8b9ea5323e70ba","type":"switch","z":"d4683cb00fc074f4","name":"","property":"payload","propertyType":"msg","rules":[{"t":"btwn","v":"50","vt":"num","v2":"150","v2t":"num"},{"t":"btwn","v":"75","vt":"num","v2":"225","v2t":"num"},{"t":"btwn","v":"135","vt":"num","v2":"310","v2t":"num"},{"t":"btwn","v":"225","vt":"num","v2":"360","v2t":"num"}],"checkall":"true","repair":false,"outputs":4,"x":1110,"y":220,"wires":[["48455c17efbb3e0a"],["1c577843af2b6990"],["95dc2e2eb8aa9796"],["fedb75e04a727314"]]},{"id":"89db626549d2ec01","type":"api-call-service","z":"d4683cb00fc074f4","name":"Close Z-O (tuin-zijde)","server":"c7b344be.584158","version":5,"debugenabled":false,"domain":"cover","service":"close_cover","areaId":[],"deviceId":[],"entityId":["cover.screens_zuidoost"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1480,"y":140,"wires":[[]]},{"id":"4b6509238501cc3c","type":"api-call-service","z":"d4683cb00fc074f4","name":"Close Z-W (garage-zijde)","server":"c7b344be.584158","version":5,"debugenabled":false,"domain":"cover","service":"close_cover","areaId":[],"deviceId":[],"entityId":["cover.screens_zuidwest"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1490,"y":200,"wires":[[]]},{"id":"d5acf8da55c9d484","type":"api-call-service","z":"d4683cb00fc074f4","name":"Close N-W (stallen-zijde)","server":"c7b344be.584158","version":5,"debugenabled":false,"domain":"cover","service":"close_cover","areaId":[],"deviceId":[],"entityId":["cover.screens_noordwest"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1490,"y":260,"wires":[[]]},{"id":"fedb75e04a727314","type":"api-current-state","z":"d4683cb00fc074f4","name":"If open","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"open","halt_if_type":"str","halt_if_compare":"is","entity_id":"cover.screens_noordwest","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"20","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1270,"y":260,"wires":[["d5acf8da55c9d484"],[]]},{"id":"a45dc9a49dad2d62","type":"time-range-switch","z":"d4683cb00fc074f4","name":"","lat":"0.0000","lon":"0.0000","startTime":"sunrise","endTime":"sunset","startOffset":"30","endOffset":"-45","x":400,"y":40,"wires":[["6207a5c49ae9721e"],[]]},{"id":"6207a5c49ae9721e","type":"api-current-state","z":"d4683cb00fc074f4","name":"Irradiance?","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"500","halt_if_type":"num","halt_if_compare":"gt","entity_id":"sensor.buienradar_irradiance","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":630,"y":40,"wires":[["4df0f8a258afbbd0"],[]]},{"id":"4df0f8a258afbbd0","type":"api-current-state","z":"d4683cb00fc074f4","name":"MaxTemperature?","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"14","halt_if_type":"num","halt_if_compare":"gt","entity_id":"sensor.buienradar_temperature_1d","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":830,"y":40,"wires":[["24257193cc4ec1c5"],[]]},{"id":"95dc2e2eb8aa9796","type":"api-current-state","z":"d4683cb00fc074f4","name":"If open","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"open","halt_if_type":"str","halt_if_compare":"is","entity_id":"cover.screens_zuidwest","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"20","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1270,"y":200,"wires":[["4b6509238501cc3c"],[]]},{"id":"1c577843af2b6990","type":"api-current-state","z":"d4683cb00fc074f4","name":"If open","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"open","halt_if_type":"str","halt_if_compare":"is","entity_id":"cover.screens_zuidoost","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"20","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1270,"y":140,"wires":[["89db626549d2ec01"],[]]},{"id":"48455c17efbb3e0a","type":"api-current-state","z":"d4683cb00fc074f4","name":"If open","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"open","halt_if_type":"str","halt_if_compare":"is","entity_id":"cover.screens_noordoost","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"20","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1270,"y":80,"wires":[["305b07639a24ec54"],[]]},{"id":"ef136633e4a08ea0","type":"api-current-state","z":"d4683cb00fc074f4","name":"CurTemperatureOutside?","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"17.5","halt_if_type":"num","halt_if_compare":"gt","entity_id":"sensor.ell_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":770,"y":120,"wires":[["bb961d4450efbb88"],[]]},{"id":"bb961d4450efbb88","type":"api-current-state","z":"d4683cb00fc074f4","name":"Azimuth?","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"0","halt_if_type":"num","halt_if_compare":"gt","entity_id":"sensor.azimuth","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":980,"y":160,"wires":[["3d8b9ea5323e70ba"],[]]},{"id":"7b9dd76d17cf5444","type":"api-call-service","z":"d4683cb00fc074f4","name":"Open N-O (weg-zijde)","server":"c7b344be.584158","version":5,"debugenabled":false,"domain":"cover","service":"open_cover","areaId":[],"deviceId":[],"entityId":["cover.screens_noordoost"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1480,"y":440,"wires":[[]],"icon":"node-red-contrib-sun-position/blind-white.svg"},{"id":"e11227ecaeaa375b","type":"switch","z":"d4683cb00fc074f4","name":"","property":"payload","propertyType":"msg","rules":[{"t":"lt","v":"50","vt":"num"},{"t":"gt","v":"150","vt":"num"},{"t":"lt","v":"75","vt":"num"},{"t":"gt","v":"225","vt":"num"},{"t":"lt","v":"135","vt":"num"},{"t":"gt","v":"310","vt":"num"},{"t":"lt","v":"225","vt":"num"}],"checkall":"true","repair":false,"outputs":7,"x":910,"y":320,"wires":[["ded16fd405efd300"],["ded16fd405efd300"],["37c1e0e1ef2cc51a"],["37c1e0e1ef2cc51a"],["3fd05c1a302b0110"],["3fd05c1a302b0110"],["39f7912578b015af"]]},{"id":"55cb6349ca59198a","type":"api-call-service","z":"d4683cb00fc074f4","name":"Open Z-O (tuin-zijde)","server":"c7b344be.584158","version":5,"debugenabled":false,"domain":"cover","service":"open_cover","areaId":[],"deviceId":[],"entityId":["cover.screens_zuidoost"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1480,"y":500,"wires":[[]]},{"id":"46e79b13d9ba1dee","type":"api-call-service","z":"d4683cb00fc074f4","name":"Open Z-W (garage-zijde)","server":"c7b344be.584158","version":5,"debugenabled":false,"domain":"cover","service":"open_cover","areaId":[],"deviceId":[],"entityId":["cover.screens_zuidwest"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1490,"y":560,"wires":[[]]},{"id":"8a1a1d1496daee67","type":"api-call-service","z":"d4683cb00fc074f4","name":"Open N-W (stallen-zijde)","server":"c7b344be.584158","version":5,"debugenabled":false,"domain":"cover","service":"open_cover","areaId":[],"deviceId":[],"entityId":["cover.screens_noordwest"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1490,"y":620,"wires":[[]]},{"id":"39f7912578b015af","type":"api-current-state","z":"d4683cb00fc074f4","name":"If closed","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"closed","halt_if_type":"str","halt_if_compare":"is","entity_id":"cover.screens_noordwest","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"20","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1280,"y":620,"wires":[["8a1a1d1496daee67"],[]]},{"id":"3fd05c1a302b0110","type":"api-current-state","z":"d4683cb00fc074f4","name":"If closed","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"closed","halt_if_type":"str","halt_if_compare":"is","entity_id":"cover.screens_zuidwest","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"20","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1280,"y":560,"wires":[["46e79b13d9ba1dee"],[]]},{"id":"37c1e0e1ef2cc51a","type":"api-current-state","z":"d4683cb00fc074f4","name":"If closed","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"closed","halt_if_type":"str","halt_if_compare":"is","entity_id":"cover.screens_zuidoost","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"20","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1280,"y":500,"wires":[["55cb6349ca59198a"],[]]},{"id":"ded16fd405efd300","type":"api-current-state","z":"d4683cb00fc074f4","name":"If closed","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"closed","halt_if_type":"str","halt_if_compare":"is","entity_id":"cover.screens_noordoost","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"20","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1280,"y":440,"wires":[["7b9dd76d17cf5444"],[]]},{"id":"49274db46054b15d","type":"api-current-state","z":"d4683cb00fc074f4","name":"Azimuth based closure when sun not in window","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"0","halt_if_type":"num","halt_if_compare":"gt","entity_id":"sensor.azimuth","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":500,"y":400,"wires":[["e11227ecaeaa375b"],[]]},{"id":"7394c23751df7d84","type":"api-current-state","z":"d4683cb00fc074f4","name":"Irradiance low?","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"60","halt_if_type":"num","halt_if_compare":"lte","entity_id":"sensor.buienradar_irradiance","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":400,"y":460,"wires":[["8dffe0f8ad4a3023"],[]]},{"id":"24257193cc4ec1c5","type":"api-current-state","z":"d4683cb00fc074f4","name":"CurWindforce?","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"5","halt_if_type":"num","halt_if_compare":"lt","entity_id":"sensor.buienradar_wind_force","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":520,"y":160,"wires":[["ef136633e4a08ea0","4d0425f10e3fdfc0"],[]]},{"id":"47f11daa742f5498","type":"api-current-state","z":"d4683cb00fc074f4","name":"Wind strong?","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"5","halt_if_type":"num","halt_if_compare":"gte","entity_id":"sensor.buienradar_wind_force","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":390,"y":520,"wires":[["ded16fd405efd300","37c1e0e1ef2cc51a","3fd05c1a302b0110","39f7912578b015af"],[]]},{"id":"633f8be5dc880278","type":"api-current-state","z":"d4683cb00fc074f4","name":"Winter?","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"winter","halt_if_type":"str","halt_if_compare":"is_not","entity_id":"sensor.season","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":200,"y":40,"wires":[["a45dc9a49dad2d62"],[]]},{"id":"1701874e1cc8a8e5","type":"comment","z":"d4683cb00fc074f4","name":"Buienradar codes","info":"https://www.home-assistant.io/integrations/buienradar/\n\nOK, OMLAAG\na: sunny/clear\nb: Mix of clear and medium or low clouds\nj: Mix of clear and high clouds\no/r: Partly cloudy (increasing character increases the condition)\nc: Heavily clouded\np: Cloudy\nd: Alternating cloudy with local fog\nn: Clear and local mist or fog\nu: Cloudy with light snow\ni/v: Heavily clouded with light snowfall (increasing character increases the condition)\nt: (Heavy snowfall)\ng: (Clear with (possibly) some heavy lightning)\n\n\n\nOMHOOG\nf: Alternatingly cloudy with some light rain\nh/k/l: rainy (increasing character increases the condition)\nq: Heavily clouded with rain\nw: Heavily clouded with rain and winter precipitation\nm: Heavily clouded with some light rain\ns: (Cloudy with (possibly) some heavy (thunderstorms) showers)","x":400,"y":580,"wires":[]},{"id":"9714cedfcbcee877","type":"api-current-state","z":"d4683cb00fc074f4","name":"Buienradar Condition Code?","server":"c7b344be.584158","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.buienradar_condition_code","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":440,"y":620,"wires":[["94888d099232744d"]]},{"id":"94888d099232744d","type":"function","z":"d4683cb00fc074f4","name":"Raining?","func":"var msg = msg.payload;\nvar msg2 = { payload: \"raining\" };\nvar msg3 = { payload: \"dry\" };\n\nif (msg == \"f\") {\n    return [msg2];\n} else if (msg == \"h\") {\n    return [msg2];\n} else if (msg == \"k\") {\n    return [msg2];\n} else if (msg == \"l\") {\n    return [msg2];\n} else if (msg == \"q\") {\n    return [msg2];\n} else if (msg == \"w\") {\n    return [msg2];\n} else if (msg == \"m\") {\n    return [msg2];\n} else if (msg == \"s\") {\n    return [msg2];\n} else {\n    return [msg3];\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":660,"y":620,"wires":[["6ae440504399de8b"]]},{"id":"6ae440504399de8b","type":"switch","z":"d4683cb00fc074f4","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"raining","vt":"str"},{"t":"eq","v":"dry","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":810,"y":620,"wires":[["ded16fd405efd300","37c1e0e1ef2cc51a","3fd05c1a302b0110","39f7912578b015af"],[]]},{"id":"4d0425f10e3fdfc0","type":"api-current-state","z":"d4683cb00fc074f4","name":"CurTemperatureInside?","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"21.5","halt_if_type":"num","halt_if_compare":"gt","entity_id":"sensor.aanwezigheid_woonkamer_air_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":770,"y":200,"wires":[["bb961d4450efbb88"],[]]},{"id":"8dffe0f8ad4a3023","type":"time-range-switch","z":"d4683cb00fc074f4","name":"","lat":"0.0000","lon":"0.0000","startTime":"sunrise","endTime":"sunset","startOffset":"0","endOffset":"-60","x":580,"y":460,"wires":[["ded16fd405efd300","37c1e0e1ef2cc51a","3fd05c1a302b0110","39f7912578b015af"],[]]},{"id":"4134b9235fa8ed74","type":"comment","z":"d4683cb00fc074f4","name":"Triggers open","info":"Azimuth - per raam\nWind - allemaal\nRegen - allemaal\nTemperatuur - allemaal","x":390,"y":340,"wires":[]},{"id":"89a655a647a5bff3","type":"trigger-state","z":"d4683cb00fc074f4","name":"","server":"c7b344be.584158","version":2,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityid":"sun.sun","entityidfiltertype":"exact","debugenabled":false,"constraints":[{"targetType":"this_entity","targetValue":"","propertyType":"current_state","propertyValue":"new_state.state","comparatorType":"is","comparatorValueDatatype":"str","comparatorValue":"below_horizon"}],"inputs":0,"outputs":2,"customoutputs":[],"outputinitially":false,"state_type":"str","enableInput":false,"x":760,"y":680,"wires":[["ded16fd405efd300","37c1e0e1ef2cc51a","3fd05c1a302b0110","39f7912578b015af"],[]]},{"id":"8079e9af5b6c4830","type":"api-current-state","z":"d4683cb00fc074f4","name":"Automatisering AAN?","server":"c7b344be.584158","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.zonwering_automatisering_onoff","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":120,"y":260,"wires":[["633f8be5dc880278","49274db46054b15d","7394c23751df7d84","47f11daa742f5498","9714cedfcbcee877"],[]]},{"id":"c7b344be.584158","type":"server","name":"Home Assistant","addon":true}]

Acties:
  • 0 Henk 'm!

  • born2tweak
  • Registratie: November 2002
  • Laatst online: 29-08 17:02
Woohooo schreef op vrijdag 12 mei 2023 @ 14:21:
Wij hadden last van een geest hier in huis die elke keer het badkamer licht aan deed, vooral overdag. Aldus mn vriendin :+

Had een Aqara switch hangen in de badkamer (WXKG11LM) die op basis van een click de state aanpast

[Afbeelding]

[Afbeelding]

Best wel ff moeten zoeken maar de state van die Aqara switch stond dus zo;

[Afbeelding]

Een paar keer per dag valt de verbinding kennelijk weg en kreeg ik een unknown state, daarna ging het licht aan voor een uurtje |:(
Wat er ook gebeurd is dat als je met de schakelaar je licht uit doet, de 1h ook getriggerd wordt en hij na een uur weer aan gaat? Of zit daar nog een filter op?

Acties:
  • 0 Henk 'm!

  • Dylantje2
  • Registratie: April 2007
  • Laatst online: 21-09 18:31

Dylantje2

sorry Bricklayere here :-)

Begin NR leuk te vinden...
Maar is er mss iemand die een open data achtige flow heeft?
Lijkt me leuk om eea van het web te importeren.
Zoiets als:
https://dataplatform.knmi.nl/group/climate

https://opendatanederland...rmat=32&Category=&Region=

Of
https://onderwijsdata.duo.nl/datasets

zonneboiler, pelletkachel, 36 panels, Atlantic Wpb, pana 5 Kw H, Heishamon, Domoticz, Grafana, Solarmeters, PVO: https://pvoutput.org/list.jsp?id=15321&sid=19520


Acties:
  • 0 Henk 'm!

  • BazemanKM
  • Registratie: Januari 2008
  • Laatst online: 23:56
Dylantje2 schreef op woensdag 7 juni 2023 @ 07:35:
Begin NR leuk te vinden...
Maar is er mss iemand die een open data achtige flow heeft?
Lijkt me leuk om eea van het web te importeren.
Zoiets als:
https://dataplatform.knmi.nl/group/climate

https://opendatanederland...rmat=32&Category=&Region=

Of
https://onderwijsdata.duo.nl/datasets
Ik importeer wel een KNMI weeralarm in Node RED, die het dan weer naar Domoticz stuurt.

https://www.fam-oldenburger.nl/category/domotica/


Acties:
  • 0 Henk 'm!

  • Dylantje2
  • Registratie: April 2007
  • Laatst online: 21-09 18:31

Dylantje2

sorry Bricklayere here :-)

BazemanKM schreef op woensdag 7 juni 2023 @ 11:59:
[...]

Ik importeer wel een KNMI weeralarm in Node RED, die het dan weer naar Domoticz stuurt.
Spannend , lijkt me leuk

zonneboiler, pelletkachel, 36 panels, Atlantic Wpb, pana 5 Kw H, Heishamon, Domoticz, Grafana, Solarmeters, PVO: https://pvoutput.org/list.jsp?id=15321&sid=19520


Acties:
  • 0 Henk 'm!

  • BazemanKM
  • Registratie: Januari 2008
  • Laatst online: 23:56

https://www.fam-oldenburger.nl/category/domotica/


Acties:
  • 0 Henk 'm!

  • CodeBaker
  • Registratie: November 2022
  • Laatst online: 17-09 15:54
Hallo,ik heb een flow gemaakt die een foto stuurt naar mijn telegrambot wanneer er beweging wordt gedetecteerd op de camera's in Frigate. alleen de snapshots bevinden zich in een loop volgens mij. Ik krijg de hele dag willekeurig verzonden snapshots in mijn Telegram-bot. Ik zie even niet wat er nu fout gaat. kan iemand mij helpen? het enige dat ik wil dat er een snapshot wordt verzonden wanneer er beweging wordt gedetecteerd.

code:
1
[{"id":"c603f6acd41a2efd","type":"api-call-service","z":"4cd060584d63b973","name":"","server":"2ac5e9467e57d943","version":5,"debugenabled":false,"domain":"telegram_bot","service":"send_photo","areaId":[],"deviceId":[],"entityId":[],"data":"{\t    \"file\": \"/media/frigate/snapshots/snapshot.jpg\",\t    \"caption\": \"Iemand bij de achterdeur!\"\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1310,"y":960,"wires":[[]]},{"id":"e183da5b77fdda2f","type":"debug","z":"4cd060584d63b973","name":"debug 8","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1160,"y":1080,"wires":[]},{"id":"13ea5100041039b6","type":"server-state-changed","z":"4cd060584d63b973","name":"Iemand bij de achtedeur?","server":"2ac5e9467e57d943","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.achterdeur_person_occupancy","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":110,"y":820,"wires":[["d76f3ea585531af0"],[]]},{"id":"f9b3eae4.f1dcd","type":"http request","z":"4cd060584d63b973","name":"Get Event IDs","method":"GET","ret":"txt","paytoqs":false,"url":"http://ccab4aaf-frigate:5000/api/events","tls":"","persist":false,"proxy":"","authType":"","x":360,"y":960,"wires":[["f10e8225.9924c","e183da5b77fdda2f"]]},{"id":"f10e8225.9924c","type":"function","z":"4cd060584d63b973","name":"Extract Event ID","func":"const events = JSON.parse(msg.payload);\n\nif (events.length > 0) {\n    const eventId = events[0].id;\n    msg.eventId = eventId;\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":580,"y":960,"wires":[["7460a7a5.4ed93"]]},{"id":"7460a7a5.4ed93","type":"http request","z":"4cd060584d63b973","name":"Get Snapshot","method":"GET","ret":"bin","paytoqs":false,"url":"http://ccab4aaf-frigate:5000/api/events/{{eventId}}/snapshot.jpg","tls":"","persist":false,"proxy":"","authType":"","x":780,"y":960,"wires":[["86e53f2b.8a2af8"]]},{"id":"86e53f2b.8a2af8","type":"file","z":"4cd060584d63b973","name":"Save Snapshot","filename":"/media/frigate/snapshots/snapshot.jpg","filenameType":"str","appendNewline":false,"createDir":true,"overwriteFile":"true","encoding":"none","x":980,"y":960,"wires":[["c603f6acd41a2efd"]]},{"id":"09e26e88157b43c2","type":"server-state-changed","z":"4cd060584d63b973","name":"Iemand op de oprit?","server":"2ac5e9467e57d943","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.oprit_person_occupancy_2","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":90,"y":1060,"wires":[["f9b3eae4.f1dcd"],[]]},{"id":"414015b1d3e7efc8","type":"api-current-state","z":"4cd060584d63b973","name":"Willem weg","server":"2ac5e9467e57d943","version":3,"outputs":2,"halt_if":"not_home","halt_if_type":"str","halt_if_compare":"is","entity_id":"person.willem","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":150,"y":960,"wires":[["f9b3eae4.f1dcd"],[]]},{"id":"d76f3ea585531af0","type":"api-current-state","z":"4cd060584d63b973","name":"Petra weg","server":"2ac5e9467e57d943","version":3,"outputs":2,"halt_if":"not_home","halt_if_type":"str","halt_if_compare":"is","entity_id":"person.petra","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":140,"y":900,"wires":[["414015b1d3e7efc8"],[]]},{"id":"2ac5e9467e57d943","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":": ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"default","statusTimeFormat":"h:m","enableGlobalContextStore":false}]

Acties:
  • +1 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
@MikeyMan

STAP 3 van de refactoring

Okee, eerst nog even een tussenstap voor ik bij de echte Zonnescherm Logica uitkom.

Ik had namelijk even naar je EvoHome flows gekeken die de Current en Target temperatuur opslaan in een global. Punt was alleen dat daarin allemaal losse globals werden gezet zoals "EvoHome_woonkamer_PV", "EvoHome_woonkamer_SP", "EvoHome_gym_PV", etc.

Deze flow zag er zo uit (maar dan met ipv de evohome-status inject node de echte evohome-status node):
Afbeeldingslocatie: https://tweakers.net/i/amg75Fix-uBpxlYp88La0Vi3YQs=/800x/filters:strip_icc():strip_exif()/f/image/pkp2jxYM8CmHfFtIRnjkkJik.jpg?f=fotoalbum_large

Echter wilde ik dit liever in een soort van array hebben, zodat ik obv de naam van de thermostaat (zone) eenvoudig de temperatuur kon opvragen. Ongeveer op deze manier dus:
code:
1
2
thermostat_state["woonkamer"].currentTemperature
thermostat_state["gym"].targetTemperature

waarbij het deel tussen [] een variabele kan zijn.

Verder had elke function node eigenlijk dezelfde inhoud, waarbij eigenlijk alleen "Woonkamer", "Gym", etc anders was. Functioneel deden ze allemaal eigenlijk hetzelfde. Dat viel dus mooi samen te voegen zolang ik maar met een variabele voor de naam/id van de thermostaat werkte.

Toen ik de documentatie voor de smooth node bekeek, zag ik dat als ik het msg.topic gebruikte en daar de naam/id van de thermostaat in zou zetten, dat ie de verschillende smooth berekeningen uit zou voeren per topic ipv voor elke binnenkomende waarde. Dit was belangrijk want de evohome-status node stuurt voor elke thermostaat/zone een apart bericht. Als topic gebruik ik nu dus de naam/id van de thermostaat.

Uiteindelijk kwam ik op de volgende flow uit om de waarden uit de EvoHome thermostaten in een global genaamd thermostat_state te zetten.

Afbeeldingslocatie: https://tweakers.net/i/zPNOc3FrtoHNcltLUu6p6CO933A=/800x/filters:strip_icc():strip_exif()/f/image/z79jhJlLIys7CwwA6J3JRIIP.jpg?f=fotoalbum_large

code:
1
[{"id":"68cbfd07aac84246","type":"change","z":"59634d1e16095311","name":"Set thermostat_id and msg.topic","rules":[{"t":"set","p":"thermostat_id","pt":"msg","to":"payload.name","tot":"msg"},{"t":"set","p":"topic","pt":"msg","to":"payload.name","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":550,"y":1600,"wires":[["b3e0803befa1df42"]]},{"id":"b3e0803befa1df42","type":"smooth","z":"59634d1e16095311","name":"","property":"payload.currentTemperature","action":"mean","count":"3","round":"2","mult":"multi","reduce":false,"x":820,"y":1600,"wires":[["68fc167745ba5dab"]]},{"id":"68fc167745ba5dab","type":"change","z":"59634d1e16095311","name":"Update (array of) thermostat states","rules":[{"t":"set","p":"thermostat_state[msg.thermostat_id].currentTemperature","pt":"global","to":"payload.currentTemperature","tot":"msg"},{"t":"set","p":"thermostat_state[msg.thermostat_id].targetTemperature","pt":"global","to":"payload.targetTemperature","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1080,"y":1600,"wires":[[]]},{"id":"e5dd121f31fa3815","type":"debug","z":"59634d1e16095311","name":"thermostat_state","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":510,"y":1660,"wires":[]},{"id":"7034feb6a2438554","type":"comment","z":"59634d1e16095311","name":"Use topic to differentiate between thermostats in smooth node","info":"","x":640,"y":1560,"wires":[]},{"id":"1e0b55c00efa2a13","type":"comment","z":"59634d1e16095311","name":"EvoHome thermostat (zone) state handling","info":"","x":240,"y":1520,"wires":[]},{"id":"cd483155bd30ee1e","type":"inject","z":"59634d1e16095311","name":"evohome-status","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":180,"y":1600,"wires":[["68cbfd07aac84246"]]},{"id":"5e223b1f61f20af2","type":"inject","z":"59634d1e16095311","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"thermostat_state","payloadType":"global","x":200,"y":1660,"wires":[["e5dd121f31fa3815"]]}]


De tweede flow is hierbij eigenlijk alleen maar om even snel te kunnen zien wat er in thermostat_state zit.
Vervang wel de evohome-status inject node even door de echte evohome-status node. Ik heb geen EvoHome dus die kon ik niet testen, maar denk wel dat het moet werken.

De global thermostat_state ziet er zo uit:
Afbeeldingslocatie: https://tweakers.net/i/Mrv-A9TRg3c3Gwu2nRsMEOybrTM=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/mqkfCHCFnqZ8ZIzcwNywG8nW.jpg?f=user_large

Doordat de output nu naar de global thermostat_state is ipv de losse "Evohome_ruimte_PV" etc globals kun je m niet 1-2-3 integreren in je huidige flows. Overigens is dat ook niet de bedoeling, maar dat wordt wel duidelijk in de volgende stappen. De manier waarop ik deze refactoring doe is namelijk om zoveel mogelijk de naamgevingen niet overeen te laten komen met wat je al hebt, zodat je huidige implementatie blijft werken, terwijl je daarnaast de nieuwe delen kunt uitproberen en uiteindelijk samenvoegen en dan kunt omschakelen (weet niet of dat helemaal lukt met het dashboard).

Een andere reden om de naamgevingen aan te passen is om ze wat duidelijker te maken. currentTemperature leest nou eenmaal lekkerder dan PV ;) Ook als alles straks 2 of 3 jaar foutloos zonder aanpassingen werkt en je er dan opeens weer naar moet kijken, dan is het handig als de namen meteen duideljik zijn. Dit is overigens ook een onderdeel van refactoring.


settings.js van Node Red aanpassen

Ik zag in veel van je function nodes dat je daar global.set('EvoHome_woonkamer_PV', Temperatuur, "file") deed om de global op het filesystem op te slaan ipv alleen in memory. Ik vermoed dat je dit onder andere in een function node deed omdat dit normaal niet mogelijk is om in bijv een change node te doen. Die slaat het normaal alleen in memory op.

Het is echter mogelijk om de setttings.js van Node Red aan te passen (niet moeilijk) om ook in nodes zoals de change node een extra optie te krijgen waarbij je kunt kiezen tussen memory of file (alleen bij global en flow variabelen).

Afbeeldingslocatie: https://tweakers.net/i/ITH-0HBBZLXVEj5UcwRPR84RR2s=/800x/filters:strip_icc():strip_exif()/f/image/6Ny3GTgmZRSsgnUsKRnKt4gi.jpg?f=fotoalbum_large

Ik heb het gedaan zoals op deze pagina staat en dus het volgende aan mijn settings.js toegevoegd:

code:
1
2
3
4
5
contextStorage: {
   default: "memoryOnly",
   memoryOnly: { module: 'memory' },
   file: { module: 'localfilesystem' }
}



Laat even weten of je hier uit komt, en of het lukt om de evohome-status node in de flow te zetten en dat ie dan werkt (of niet).

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • denuz
  • Registratie: Augustus 2006
  • Laatst online: 02:41
CodeBaker schreef op vrijdag 9 juni 2023 @ 15:26:
Hallo,ik heb een flow gemaakt die een foto stuurt naar mijn telegrambot wanneer er beweging wordt gedetecteerd op de camera's in Frigate. alleen de snapshots bevinden zich in een loop volgens mij. Ik krijg de hele dag willekeurig verzonden snapshots in mijn Telegram-bot. Ik zie even niet wat er nu fout gaat. kan iemand mij helpen? het enige dat ik wil dat er een snapshot wordt verzonden wanneer er beweging wordt gedetecteerd.

code:
1
[{"id":"c603f6acd41a2efd","type":"api-call-service","z":"4cd060584d63b973","name":"","server":"2ac5e9467e57d943","version":5,"debugenabled":false,"domain":"telegram_bot","service":"send_photo","areaId":[],"deviceId":[],"entityId":[],"data":"{\t    \"file\": \"/media/frigate/snapshots/snapshot.jpg\",\t    \"caption\": \"Iemand bij de achterdeur!\"\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1310,"y":960,"wires":[[]]},{"id":"e183da5b77fdda2f","type":"debug","z":"4cd060584d63b973","name":"debug 8","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1160,"y":1080,"wires":[]},{"id":"13ea5100041039b6","type":"server-state-changed","z":"4cd060584d63b973","name":"Iemand bij de achtedeur?","server":"2ac5e9467e57d943","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.achterdeur_person_occupancy","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":110,"y":820,"wires":[["d76f3ea585531af0"],[]]},{"id":"f9b3eae4.f1dcd","type":"http request","z":"4cd060584d63b973","name":"Get Event IDs","method":"GET","ret":"txt","paytoqs":false,"url":"http://ccab4aaf-frigate:5000/api/events","tls":"","persist":false,"proxy":"","authType":"","x":360,"y":960,"wires":[["f10e8225.9924c","e183da5b77fdda2f"]]},{"id":"f10e8225.9924c","type":"function","z":"4cd060584d63b973","name":"Extract Event ID","func":"const events = JSON.parse(msg.payload);\n\nif (events.length > 0) {\n    const eventId = events[0].id;\n    msg.eventId = eventId;\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":580,"y":960,"wires":[["7460a7a5.4ed93"]]},{"id":"7460a7a5.4ed93","type":"http request","z":"4cd060584d63b973","name":"Get Snapshot","method":"GET","ret":"bin","paytoqs":false,"url":"http://ccab4aaf-frigate:5000/api/events/{{eventId}}/snapshot.jpg","tls":"","persist":false,"proxy":"","authType":"","x":780,"y":960,"wires":[["86e53f2b.8a2af8"]]},{"id":"86e53f2b.8a2af8","type":"file","z":"4cd060584d63b973","name":"Save Snapshot","filename":"/media/frigate/snapshots/snapshot.jpg","filenameType":"str","appendNewline":false,"createDir":true,"overwriteFile":"true","encoding":"none","x":980,"y":960,"wires":[["c603f6acd41a2efd"]]},{"id":"09e26e88157b43c2","type":"server-state-changed","z":"4cd060584d63b973","name":"Iemand op de oprit?","server":"2ac5e9467e57d943","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.oprit_person_occupancy_2","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":90,"y":1060,"wires":[["f9b3eae4.f1dcd"],[]]},{"id":"414015b1d3e7efc8","type":"api-current-state","z":"4cd060584d63b973","name":"Willem weg","server":"2ac5e9467e57d943","version":3,"outputs":2,"halt_if":"not_home","halt_if_type":"str","halt_if_compare":"is","entity_id":"person.willem","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":150,"y":960,"wires":[["f9b3eae4.f1dcd"],[]]},{"id":"d76f3ea585531af0","type":"api-current-state","z":"4cd060584d63b973","name":"Petra weg","server":"2ac5e9467e57d943","version":3,"outputs":2,"halt_if":"not_home","halt_if_type":"str","halt_if_compare":"is","entity_id":"person.petra","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":140,"y":900,"wires":[["414015b1d3e7efc8"],[]]},{"id":"2ac5e9467e57d943","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":": ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"default","statusTimeFormat":"h:m","enableGlobalContextStore":false}]
In je flow zie ik niets geks.
Enige reden waardoor er steeds een snap verzonden wordt is dat je binary sensors achterdeur en oprit naar 'on' gaat.
Kun je eens de history van deze sensoren bekijken/posten in home assistant? Ik denk dat het in de state van deze 2 sensoren zit.

Acties:
  • 0 Henk 'm!

  • CodeBaker
  • Registratie: November 2022
  • Laatst online: 17-09 15:54
@denuz Ik gebruik nu de person count sensors, werkt nu perfect.

Acties:
  • 0 Henk 'm!

  • grote_oever
  • Registratie: Augustus 2002
  • Laatst online: 07:54
Ik loop al tijdje tegen een probleem aan waar ik gewoon niet omheen kom. Sterk heb ik het idee dat ik volkomen fout doe (of ik begrijp het nog niet lekker).

Sinds enkele maanden heb ik een nieuw PV-systeem van APS. Cheap en knalt wbt KWH alle mijn andere systemen eruit, dus helemaal prima. Echter is de integratie behoorlijk ruk. Wil je nette API dan moet je een ander systeem kiezen. Maar goed, er zijn gelukkig wel oplossingen. Zo is er op Tweakers een keurig topic om het lokaal uit te lezen:

APS ecu-r lokaal data uitlezen (projectje)

Maar er is ook een stabiel werkende HTTP grabber integratie beschikbaar:

https://github.com/skelgaard/homeassistant-apsystems

In beide gevallen via HomeAssistant. Ik heb de lokale versie draaien via HomeAssistant en dat werkt op zich prima.

Maar het mooiste zou zijn dat het me lukt in Node-red. Het idee is dan ook dat ik dit script:

https://github.com/skelga...nents/apsystems/sensor.py

wil omzetten naar een flow in node-red. Dit lukt mij half en ik kan niet precies achterkomen waar het mis gaat.

Het python script draait op 2 URL's, namelijk:

code:
1
2
    url_login = "https://www.apsystemsema.com/ema/intoDemoUser.action?id="
    url_data = "https://www.apsystemsema.com/ema/ajax/getReportApiAjax/getPowerOnCurrentDayAjax"


het inloggen op de website en daarna het scrappen van data via JSON. In mijn browser kan ik dit precies doorlopen en krijg de waardes keurig in JSON te zien in mijn browser.

Als ik dat omzet naar Node-red lukt mij het eerste gedeelte wel. Ik zie dat ik keurig inlog en een redirect krijg naar het dashboard. Het scrappen van data resulteert echter altijd in een foutmelding en ik kom niet achter wat hiervoor nodig is. Iemand enig idee wat ik fout doe?

Dit is de flow:

Afbeeldingslocatie: https://tweakers.net/i/JTBH2wF6lMFAFoDh_KLPOjTlor4=/800x/filters:strip_icc():strip_exif()/f/image/EeiytsyGUrkMyBttlb8HSlre.jpg?f=fotoalbum_large

De redirect van de eerste flow is naar deze URL en dat lijkt me een succesvolle inlog:
De redirect van de 2de URL is:
Dit is de code voor de functie login:

code:
1
2
3
msg.url = 'https://www.apsystemsema.com/ema/intoDemoUser.action?id=<mijn ID>';
msg.method = "GET";
return msg;


Als ik bovenstaande URL in mijn browser plak kom ik keurig in het dashboard (waar ik ook terug krijg als redirect URL). Dus dat lijkt goed te werken.

Dit is de code voor de functie Datascrappen:

code:
1
2
3
4
5
6
7
8
9
10
11
msg.url = 'https://www.apsystemsema.com/ema/ajax/getReportApiAjax/getPowerOnCurrentDayAjax';
msg.payload = {
    queryDate: '20230608',
    selectedValue: '<Mijn ECU ID>',
    systemId: '<Mijn systeemID>'
};

msg.method = "POST";
msg.headers = { 
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0'    };
return msg;


Dit gedeelte lukt niet. Als ik inspector uitvoer in mijn browser dan zie ik de waardes voorbij komen:

Afbeeldingslocatie: https://tweakers.net/i/kWs3U04OU1TGsL2vYrFf2hZqsUE=/800x/filters:strip_icc():strip_exif()/f/image/RJJfOivqP0kMve4IsVeLv1Cb.jpg?f=fotoalbum_large

Als ik deze waardes mee geef als payload (en ik vraag me af of dit correct is) dan krijg ik dus een error terug. Terwijl de browers keurig de JSON terug geeft:

Afbeeldingslocatie: https://tweakers.net/i/fYd2tWSktikgYDHxYSl_0n-ZQZk=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/5Dez1iSCONSK7gBg92hDFgyj.jpg?f=user_large

Ik heb het idee dat ik iets over het hoofd zie wat gewoon niet kan.

p.s. het draait keurig in Homeassistent, maar ik sta op het punt dat het een principe kwestie is. Iemand enig idee wat ik fout doe?

Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
@grote_oever
Wat is de foutmelding?

En weet niet zeker of dit het is, maar ik zie in je inspector screencapture staan "formuliergegevens". Echter stuur je het volgens mij niet in de vorm van formulierdata.

Ik zie in de docs van de http-request node het volgende staan:
To encode the request as form data, msg.headers["content-type"] should be set to application/x-www-form-urlencoded.
Wat heb je in de laatste http-request node verder nog ingesteld?

Je zou eventueel eerst met curl kunnen testen of je het voor elkaar krijgt.

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • Edd
  • Registratie: Januari 2001
  • Laatst online: 01:25

Edd

@grote_oever

Nu ben ik niet zo geweldig met Python, maar ik zie dat in het python-script de volgende aanroep wordt gedaan voor de url_data.
code:
1
2
3
4
5
6
7
8
9
result_data = await self._hass.async_add_executor_job(
                s.request,
                "POST",
                self.url_data,
                None,
                post_data,
                self.headers,
                browser.cookies.get_dict(),
            )


Daarbij wordt een parameter browser.cookies meegegeven, welke ik niet terug zie in jouw code.
Mijn vermoeden is dat er na het inloggen een cookie wordt geplaatst, waarmee de login-sessie wordt bewaard en je deze dient mee te sturen met jouw call.

EDIT:
alhoewel je natuurlijk het msg-object aanpast in jouw code. Ik weet niet of de cookies daar in zitten, blijven en/of Node-red hier precies mee omgaat.

[ Voor 10% gewijzigd door Edd op 01-07-2023 13:10 ]

-


Acties:
  • 0 Henk 'm!

  • grote_oever
  • Registratie: Augustus 2002
  • Laatst online: 07:54
musicpixel schreef op zaterdag 1 juli 2023 @ 12:56:
@grote_oever
Wat is de foutmelding?

En weet niet zeker of dit het is, maar ik zie in je inspector screencapture staan "formuliergegevens". Echter stuur je het volgens mij niet in de vorm van formulierdata.

Ik zie in de docs van de http-request node het volgende staan:


[...]


Wat heb je in de laatste http-request node verder nog ingesteld?

Je zou eventueel eerst met curl kunnen testen of je het voor elkaar krijgt.
Ik krijg niet echt een foutmelding. Ik krijg statuscode 200 terug en de redirect pagina is: https://www.apsystemsema.com/ema/error.action

Verder heb ik niks ingesteld in de HTTP-request node. Hij haalt alle informatie uit de functie's die ik hierboven heb gepost.

Login-functie (deze werkt volgens mij):

code:
1
2
3
msg.url = 'https://www.apsystemsema.com/ema/intoDemoUser.action?id=<mijn ID>';
msg.method = "GET";
return msg;



Datascrappen:

code:
1
2
3
4
5
6
7
8
9
10
11
msg.url = 'https://www.apsystemsema.com/ema/ajax/getReportApiAjax/getPowerOnCurrentDayAjax';
msg.payload = {
    queryDate: '20230608',
    selectedValue: '<Mijn ECU ID>',
    systemId: '<Mijn systeemID>'
};

msg.method = "POST";
msg.headers = { 
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0'    };
return msg;


Hier gaat het mis!

Maar wat @Edd zegt kan inderdaad nog wel eens de oplossing zijn. Maar ik heb de output van function "Datascrappen" eens gestuurd naar een debug, maar de cookies objecten zijn nog steeds te vinden in de message:

Afbeeldingslocatie: https://tweakers.net/i/qlf30u_EsWdyUO2kLAd6sZRlc7s=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/BODW8QQmau1OT3NJyH8mH3mi.png?f=user_large

Ik zit even te googleen op cookies en http-request, maar volgens mij is dit wel de juiste manier om de cookies mee te sturen.

Ik heb voor de zekerheid de cookies informatie verplaatst naar msg.cookies. Maar dat maakt ook niet uit.

[ Voor 5% gewijzigd door grote_oever op 01-07-2023 15:49 ]


Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
grote_oever schreef op zaterdag 1 juli 2023 @ 15:38:
[...]

Ik krijg niet echt een foutmelding. Ik krijg statuscode 200 terug en de redirect pagina is: https://www.apsystemsema.com/ema/error.action
Ik vermoed dat de data die je POST inderdaad niet juist is geformatteerd en dat de ontvanger er daarom niets van snapt. Ik denk dat jij in application/json formaat stuurt ipv application/x-www-form-urlencoded, want volgens de docs van http-request:
If msg.payload is an Object, the node will automatically set the content type of the request to application/json and encode the body as such.

To encode the request as form data, msg.headers["content-type"] should be set to application/x-www-form-urlencoded.
Voor een voorbeeld van hoe de verschillende types er uit zien, kijk even hier, ergens halverwege staan een paar voorbeelden.

Ik vermoed dat als je de regel
code:
1
msg.headers["content-type"] = "application/x-www-form-urlencoded";

toevoegt het wel eens zou kunnen gaan werken.

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • grote_oever
  • Registratie: Augustus 2002
  • Laatst online: 07:54
musicpixel schreef op zaterdag 1 juli 2023 @ 16:18:
[...]


Ik vermoed dat de data die je POST inderdaad niet juist is geformatteerd en dat de ontvanger er daarom niets van snapt. Ik denk dat jij in application/json formaat stuurt ipv application/x-www-form-urlencoded, want volgens de docs van http-request:


[...]


Voor een voorbeeld van hoe de verschillende types er uit zien, kijk even hier, ergens halverwege staan een paar voorbeelden.

Ik vermoed dat als je de regel
code:
1
msg.headers["content-type"] = "application/x-www-form-urlencoded";

toevoegt het wel eens zou kunnen gaan werken.
Ik heb deze regel toegevoegd aan de functie "Datascrappen":

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
msg.url = 'https://www.apsystemsema.com/ema/ajax/getReportApiAjax/getPowerOnCurrentDayAjax';
msg.payload = {
    queryDate: '20230608',
    selectedValue: 'mijn ECU ID',
    systemId: 'Mijn systeem ID'
};

msg.method = "POST";
msg.headers = { 
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0',
    'content-type': 'application/x-www-form-urlencoded'
        };
return msg;


* grote_oever weet dat de user-agent wel belangrijk is. Wordt ook meegegeven in Home-assistant script.

en tevens aan de HTTP REQUEST.

In beide gevallen werkt het helaas niet. Ik blijf twijfelen of ik die cookies op een goede plek ziet in de msg. Heb hem verplaatst van msg.redirectList[1].cookies naar msg.cookies.

In beide gevallen werkt het ook nog niet.

Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
@grote_oever Even verder gekeken naar de code van de apsystems home assistant plugin:

https://github.com/bgbrag...nents/apsystems/sensor.py

In deze file zie ik een andere User Agent dan die jij hebt opgegeven, op regel 188 staat namelijk

[code]
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0'
[/code]

Toen ik deze User Agent gebruikte kreeg ik opeens een andere error met statuscode 405 ipv 200.

Natuurlijk kon ik niet inloggen, maar zou deze user agent eens vervangen en kijken wat het resultaat is.


Nevermind, foutje in mijn code....

[ Voor 3% gewijzigd door musicpixel op 02-07-2023 12:27 ]

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
@grote_oever Hier zag je in je browser de form data. Ik zie daar ook een tabje cookies. Wat staat daar onder als je de verschillende pagina's opvraagt? En dan met name bij ...getPowerOnCurrentDayAjax als die er tussen staat tenminste...

Afbeeldingslocatie: https://tweakers.net/i/kWs3U04OU1TGsL2vYrFf2hZqsUE=/800x/filters:strip_icc():strip_exif()/f/image/RJJfOivqP0kMve4IsVeLv1Cb.jpg?f=fotoalbum_large

Ik vermoed dat JSESSIONID de belangrijkste is om door te geven. Wat de rest van de cookies doet die je in je screencapture laat zien weet ik niet.

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • grote_oever
  • Registratie: Augustus 2002
  • Laatst online: 07:54
musicpixel schreef op zondag 2 juli 2023 @ 13:05:
@grote_oever Hier zag je in je browser de form data. Ik zie daar ook een tabje cookies. Wat staat daar onder als je de verschillende pagina's opvraagt? En dan met name bij ...getPowerOnCurrentDayAjax als die er tussen staat tenminste...

[Afbeelding]

Ik vermoed dat JSESSIONID de belangrijkste is om door te geven. Wat de rest van de cookies doet die je in je screencapture laat zien weet ik niet.
Bedankt voor je reactie.

De cookies komen in de browser, kwa informatie, overeen met wat ik in node-red zie:

Afbeeldingslocatie: https://tweakers.net/i/znKT-E8Z-hT5uuNBOmL7Eb-EdVk=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/I2DlavVIKESiVPAfGbzf9ic2.jpg?f=user_large

Afbeeldingslocatie: https://tweakers.net/i/m8h8YlYSxILqhPoyj2Pd3qJWmVM=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/p8kq2FtUHFB82krDgQj1j2ft.jpg?f=user_large

JessionId kom ik in node-red wel tegen: 287d6917-56a5-4b00-8924-b0db0feb5d95

Ik kan heel slecht zien hoe node-red omgaat met de cookies. Veel info is er niet over te vinden en de info die ik erover vind beschrijft het best onduidelijk. Ook benomen de meeste dat de cookies te vinden moeten zijn onder msg.cookies. Maar daar heb ik dus twijfels bij.

p.s. User-agent heb ik letterlijk gekopieerd van mijn huidige browser. orgineel in script staat deze User-Agent:

code:
1
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Chrome/50.0.2661.102 Firefox/62.0"


edit: ik gebruik deze guide voor de cookies: https://cookbook.nodered.org/http/work-with-cookies
Ik verplaatst de cookies naar msg.cookies.

Edit2: als ik met curl het script probeer na te lopen dan loop ik continue tegen een 403 Forbidden melding aan. Even verdiepen hoe dit aangepast moet worden.

[ Voor 12% gewijzigd door grote_oever op 02-07-2023 17:46 ]


Acties:
  • +1 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
Als ik jouw twee screencaptures zo even vergelijk, dan mis ik bij Node Red de volgende twee cookies:
JSESSIONID
manageFlag

Let op het verschil tussen jessionId en JSESSIONID. Ik heb geen idee waarom er trouwens een jessionId is, lijkt op een bug in hun api... JSESSIONID is iig een ID die er voor zorgt dat de webserver die je aanroept weet dat het nog dezelfde sessie is.

In een browser worden normaal gesproken cookies opgeslagen, en bij een volgende pagina zijn deze dan gewoon beschikbaar. Lijkt alsof je de cookies die je onder 0 en 1 in de redirectList (in de eerdere screencapture) moet combineren en dan samen als msg.cookies moet doorgeven aan de http-request node.

Volgens mij zet redirectList[0] de cookies ;Path en JSESSIONID en redirectList[1] voegt er dan die andere cookies aan toe als het een normale browser zou zijn. Dat python script wat je aanhaalde doet zich ook voor als browser. Misschien dat dit verschilt van de http-request node op het gebied van de cookies.

Als je wilt checken of de cookies goed doorkomen bij de aanroep met de http-request node dan zou je, als je een webserver beschikbaar hebt, de aanroep kunnen sturen naar een zelf gemaakte pagina waarbij je de cookies dumpt (in php met var_dump($_COOKIE);)

Verder kun je nog in je browser kijken welke cookies er allemaal zijn gezet voor het domein apsystemsema.com. Ik denk dat je daar de combinatie van redirectList[0] en [1] zult zien plus evt nog andere cookies.

Feel free to Buy me a coffee


Acties:
  • +1 Henk 'm!

  • grote_oever
  • Registratie: Augustus 2002
  • Laatst online: 07:54
@musicpixel Het is me inmiddels gelukt! Ik log nu keurig in met node-red en haal de informatie op zonder foutcode.

Probleem zat inderdaad in het Content-Type en de cookies.

contenttype:
code:
1
    'Content-Type': 'application/x-www-form-urlencoded'


En kennelijk is het moven van de cookies niet voldoende. Als ik hem handmatig set (geen idee of ik dit netjes doe) dan werkt het wel:

Ik heb de cookies gepakt die verzonden worden en alle velden één voor één gevuld met de info uit node-red:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
msg.cookies = { 
    "JSESSIONID": msg.redirectList[1].cookies.jessionId.value, 
    "ezUserFlag": msg.redirectList[1].cookies.ezUserFlag.value,
    "sessionId": msg.redirectList[1].cookies.jessionId.value,
    "jessionId": msg.redirectList[1].cookies.jessionId.value,
    "userId": msg.redirectList[1].cookies.userId.value,
    "page_logo": msg.redirectList[1].cookies.page_logo.value,
    "noticeFlag": msg.redirectList[1].cookies.noticeFlag.value,
    "privateFlag": msg.redirectList[1].cookies.privateFlag.value,
    "userGrade": msg.redirectList[1].cookies.userGrade.value,
    "loginPageUrl": msg.redirectList[1].cookies.loginPageUrl.value,
    "loginActionUrl": msg.redirectList[1].cookies.loginActionUrl.value,
    "logoTitle": msg.redirectList[1].cookies.logoTitle.value,
    "logoutActionUrl": msg.redirectList[1].cookies.logoutActionUrl.value,
    "cssFile": msg.redirectList[1].cookies.cssFile.value,
    "twflag": msg.redirectList[1].cookies.twflag.value,
    "language": msg.redirectList[1].cookies.language.value,
    "manageFlag": 13
     };

[ Voor 3% gewijzigd door grote_oever op 08-07-2023 10:03 ]


Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
@grote_oever
Ik vermoed dat je tegen het "deep copy" vs "shallow copy" aan bent gelopen bij het "moven van de cookies".

En inderdaad niet de meest nette manier, maar het werkt. Alleen een probleem als er bij apsystemsema iets verandert in hun cookies. Minst foutgevoelig zou zijn om een soort van cookiejar te maken waar je steeds de nieuwe cookies die je binnenkrijgt in kopieert, dan wel overschrijft. Beetje zoals een browser het ook zou doen.

En check even de derde cookie die je zet, daar staat aan de rechterkant nog jessionId, wat volgens mij sessionId moet zijn.

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • grote_oever
  • Registratie: Augustus 2002
  • Laatst online: 07:54
musicpixel schreef op zaterdag 8 juli 2023 @ 11:01:
@grote_oever
Ik vermoed dat je tegen het "deep copy" vs "shallow copy" aan bent gelopen bij het "moven van de cookies".

En inderdaad niet de meest nette manier, maar het werkt. Alleen een probleem als er bij apsystemsema iets verandert in hun cookies. Minst foutgevoelig zou zijn om een soort van cookiejar te maken waar je steeds de nieuwe cookies die je binnenkrijgt in kopieert, dan wel overschrijft. Beetje zoals een browser het ook zou doen.

En check even de derde cookie die je zet, daar staat aan de rechterkant nog jessionId, wat volgens mij sessionId moet zijn.
Ja, klopt. Ik zie dat ik 3x sessieID meegeef. Maar dat doet de website ook. Was al blij dat het werkte en dat ik goed resultaat terug krijg. Nu even ombouwen dat hij checkt of ik een nieuwe sessie moet aanvragen of de oude kan gebruiken.

Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
grote_oever schreef op zaterdag 8 juli 2023 @ 11:12:
[...]


Ja, klopt. Ik zie dat ik 3x sessieID meegeef. Maar dat doet de website ook. Was al blij dat het werkte en dat ik goed resultaat terug krijg. Nu even ombouwen dat hij checkt of ik een nieuwe sessie moet aanvragen of de oude kan gebruiken.
Ik bedoelde dit:

"sessionId": msg.redirectList[1].cookies.jessionId.value

Volgens mij moet die j een s zijn op de derde regel.

Feel free to Buy me a coffee


Acties:
  • +1 Henk 'm!

  • grote_oever
  • Registratie: Augustus 2002
  • Laatst online: 07:54
musicpixel schreef op zaterdag 8 juli 2023 @ 12:16:
[...]


Ik bedoelde dit:

"sessionId": msg.redirectList[1].cookies.jessionId.value

Volgens mij moet die j een s zijn op de derde regel.
Ja, ik snap wat jij bedoelt, maar dat is volgens mij een "fout" in de website zelf. Als ik kijk naar wat de browser verstuurd zit daar ook een fout in:

Afbeeldingslocatie: https://tweakers.net/i/znKT-E8Z-hT5uuNBOmL7Eb-EdVk=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/I2DlavVIKESiVPAfGbzf9ic2.jpg?f=user_large

Heb letterlijk zo alles overgenomen. Ik stuur trouwens 3x dezelfde sessieID mee. één keer met hoofdletters, één keer verkeerd geschreven en één keer zonder hoofdletters. En alle 3x hebben ze dezelfde value. Ik kan hem nog wel even uitkleden en kijken waar hij echt op triggert. Maar ben al blij dat het zo werkt :)

Acties:
  • 0 Henk 'm!

  • Wachten...
  • Registratie: Januari 2008
  • Laatst online: 07:17
Weet iemand of deze 2 basis instellingen ervoor zorgen dat het zonnescherm dichtgaat bij windkracht 5
of hoger, of als er binnen 60 minuten regen wordt verwacht? (de configuratie staat op 60 minuten in de buienradar integratie)

Ik ben nog niet echt thuis in het voorspellen van het weer en aan de hand daar van meldingen of acties toe te passen.

Ik wilde nu even kijken of ik met een basis kon beginnen voor als ik even niet thuis ben, en ons zonnescherm uit staat. Mocht het dan gaan regenen of de wind toenemen, dat het scherm dan vanzelf dicht gaat. Ik wil daarna gaan kijken naar het automatisch openen bij bepaalde waardes en tijden.

Afbeeldingslocatie: https://tweakers.net/i/9BCZSn9W1xhfaNn6xw78SAm0tGo=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/lKiD3vTalzZbsaJ3s7x0kRl2.png?f=user_large


code:
1
[{"id":"d4683cb00fc074f4","type":"tab","label":"Sunscreens","disabled":false,"info":"","env":[]},{"id":"6015b64732da9716","type":"api-current-state","z":"d4683cb00fc074f4","name":"","server":"9b8bc642.fed038","version":3,"outputs":2,"halt_if":"5","halt_if_type":"num","halt_if_compare":"gte","entity_id":"sensor.wind_force","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":310,"y":60,"wires":[["b27df8ca94fb3afd"],[]]},{"id":"b27df8ca94fb3afd","type":"api-call-service","z":"d4683cb00fc074f4","name":"","server":"9b8bc642.fed038","version":5,"debugenabled":false,"domain":"cover","service":"close_cover","areaId":[],"deviceId":[],"entityId":["cover.zonwering_achtertuin"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":570,"y":60,"wires":[[]]},{"id":"61bd89b2c1571de8","type":"api-call-service","z":"d4683cb00fc074f4","name":"","server":"9b8bc642.fed038","version":5,"debugenabled":false,"domain":"cover","service":"set_cover_position","areaId":[],"deviceId":[],"entityId":["cover.zonwering_achtertuin"],"data":"{    \"position\": 40 }","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":590,"y":160,"wires":[[]]},{"id":"5be5643674ef0a34","type":"api-current-state","z":"d4683cb00fc074f4","name":"","server":"9b8bc642.fed038","version":3,"outputs":2,"halt_if":"10","halt_if_type":"num","halt_if_compare":"lt","entity_id":"sensor.wind_force","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":310,"y":160,"wires":[["61bd89b2c1571de8"],[]]},{"id":"618d3a4ea234c56e","type":"inject","z":"d4683cb00fc074f4","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":80,"y":60,"wires":[["6015b64732da9716"]]},{"id":"1193d890327063f0","type":"inject","z":"d4683cb00fc074f4","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":80,"y":160,"wires":[["5be5643674ef0a34"]]},{"id":"16155f625119ee41","type":"server-state-changed","z":"d4683cb00fc074f4","name":"Windkracht 5 of hoger","server":"9b8bc642.fed038","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.wind_force","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"5","halt_if_type":"num","halt_if_compare":"gte","outputs":2,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":140,"y":280,"wires":[["1fb64c8dc25f836e"],[]]},{"id":"1fb64c8dc25f836e","type":"api-call-service","z":"d4683cb00fc074f4","name":"","server":"9b8bc642.fed038","version":5,"debugenabled":false,"domain":"cover","service":"close_cover","areaId":[],"deviceId":[],"entityId":["cover.zonwering_achtertuin"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":450,"y":280,"wires":[[]]},{"id":"16832e301fcc1fcd","type":"server-state-changed","z":"d4683cb00fc074f4","name":"Regen komende uur","server":"9b8bc642.fed038","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.precipitation","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"0","halt_if_type":"num","halt_if_compare":"gt","outputs":2,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":130,"y":340,"wires":[["47d0ac56752fcbbd"],[]]},{"id":"47d0ac56752fcbbd","type":"api-call-service","z":"d4683cb00fc074f4","name":"","server":"9b8bc642.fed038","version":5,"debugenabled":false,"domain":"cover","service":"close_cover","areaId":[],"deviceId":[],"entityId":["cover.zonwering_achtertuin"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":450,"y":340,"wires":[[]]},{"id":"9b8bc642.fed038","type":"server","name":"Home Assistant","version":4,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":false,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30,"areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m"}]

Als je dit kunt lezen, dan werkt mij Signature!


Acties:
  • +1 Henk 'm!

  • Wachten...
  • Registratie: Januari 2008
  • Laatst online: 07:17
Ik ben even aan het kijken naar mijn zonwering. Deze wil ik na een bepaalde tijd ingeklapt hebben naar 50 procent.

Het enige is dat ik eerst wil dat hij kijkt of het zonnescherm voor meer dan 50 procent uitgeklapt is (anders hoeft het namelijk niet).

Ik zat even te kijken naar de current state node, maar is het mogelijk om daar de volgende attribute in te verwerken.

data.attributes.current_position

Dit is namelijk de data die staat bij de "current_position"

EDIT:

Het is inmiddels gelukt met deze JSON

code:
1
$entity().attributes.current_position > 50


Afbeeldingslocatie: https://tweakers.net/i/0ICFOQg54VFAhuR73qhcp70Xz4s=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/0FT2vd38tZ1XdctAlJP0r7Xf.png?f=user_large

[ Voor 23% gewijzigd door Wachten... op 13-07-2023 13:52 ]

Als je dit kunt lezen, dan werkt mij Signature!


Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

musicpixel schreef op woensdag 14 juni 2023 @ 17:22:
@MikeyMan

STAP 3 van de refactoring

Okee, eerst nog even een tussenstap voor ik bij de echte Zonnescherm Logica uitkom.

Ik had namelijk even naar je EvoHome flows gekeken die de Current en Target temperatuur opslaan in een global. Punt was alleen dat daarin allemaal losse globals werden gezet zoals "EvoHome_woonkamer_PV", "EvoHome_woonkamer_SP", "EvoHome_gym_PV", etc.

Deze flow zag er zo uit (maar dan met ipv de evohome-status inject node de echte evohome-status node):
[Afbeelding]

Echter wilde ik dit liever in een soort van array hebben, zodat ik obv de naam van de thermostaat (zone) eenvoudig de temperatuur kon opvragen. Ongeveer op deze manier dus:
code:
1
2
thermostat_state["woonkamer"].currentTemperature
thermostat_state["gym"].targetTemperature

waarbij het deel tussen [] een variabele kan zijn.

Verder had elke function node eigenlijk dezelfde inhoud, waarbij eigenlijk alleen "Woonkamer", "Gym", etc anders was. Functioneel deden ze allemaal eigenlijk hetzelfde. Dat viel dus mooi samen te voegen zolang ik maar met een variabele voor de naam/id van de thermostaat werkte.

Toen ik de documentatie voor de smooth node bekeek, zag ik dat als ik het msg.topic gebruikte en daar de naam/id van de thermostaat in zou zetten, dat ie de verschillende smooth berekeningen uit zou voeren per topic ipv voor elke binnenkomende waarde. Dit was belangrijk want de evohome-status node stuurt voor elke thermostaat/zone een apart bericht. Als topic gebruik ik nu dus de naam/id van de thermostaat.

Uiteindelijk kwam ik op de volgende flow uit om de waarden uit de EvoHome thermostaten in een global genaamd thermostat_state te zetten.

[Afbeelding]

code:
1
[{"id":"68cbfd07aac84246","type":"change","z":"59634d1e16095311","name":"Set thermostat_id and msg.topic","rules":[{"t":"set","p":"thermostat_id","pt":"msg","to":"payload.name","tot":"msg"},{"t":"set","p":"topic","pt":"msg","to":"payload.name","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":550,"y":1600,"wires":[["b3e0803befa1df42"]]},{"id":"b3e0803befa1df42","type":"smooth","z":"59634d1e16095311","name":"","property":"payload.currentTemperature","action":"mean","count":"3","round":"2","mult":"multi","reduce":false,"x":820,"y":1600,"wires":[["68fc167745ba5dab"]]},{"id":"68fc167745ba5dab","type":"change","z":"59634d1e16095311","name":"Update (array of) thermostat states","rules":[{"t":"set","p":"thermostat_state[msg.thermostat_id].currentTemperature","pt":"global","to":"payload.currentTemperature","tot":"msg"},{"t":"set","p":"thermostat_state[msg.thermostat_id].targetTemperature","pt":"global","to":"payload.targetTemperature","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1080,"y":1600,"wires":[[]]},{"id":"e5dd121f31fa3815","type":"debug","z":"59634d1e16095311","name":"thermostat_state","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":510,"y":1660,"wires":[]},{"id":"7034feb6a2438554","type":"comment","z":"59634d1e16095311","name":"Use topic to differentiate between thermostats in smooth node","info":"","x":640,"y":1560,"wires":[]},{"id":"1e0b55c00efa2a13","type":"comment","z":"59634d1e16095311","name":"EvoHome thermostat (zone) state handling","info":"","x":240,"y":1520,"wires":[]},{"id":"cd483155bd30ee1e","type":"inject","z":"59634d1e16095311","name":"evohome-status","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":180,"y":1600,"wires":[["68cbfd07aac84246"]]},{"id":"5e223b1f61f20af2","type":"inject","z":"59634d1e16095311","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"thermostat_state","payloadType":"global","x":200,"y":1660,"wires":[["e5dd121f31fa3815"]]}]


De tweede flow is hierbij eigenlijk alleen maar om even snel te kunnen zien wat er in thermostat_state zit.
Vervang wel de evohome-status inject node even door de echte evohome-status node. Ik heb geen EvoHome dus die kon ik niet testen, maar denk wel dat het moet werken.
Heef even geduurd ivm vakantie en verbouwing. Maar weer met frisse moed verder. Dit is inderdaad een vergaande versimpeling. Had ik zelf nooit zo kunnen bedenken, maar lijkt me een hele stap voorwaarts vanuit de flow bezien. Heb hem geimporteerd, en wat debug nodes toegevoegd aan eerste node.
Lijkt nog niet helemaal goed te gaan:
Afbeeldingslocatie: https://tweakers.net/i/xMF1rfJz43kBD4ZrbXn3jddLlj4=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/ZelrGoMaGLXhcSOm7eo7JxN1.png?f=user_large

Timestamp komt in de payload, maar daar blijft het bij. Eens kijken wat ik hiermee kan.
De global thermostat_state ziet er zo uit:
[Afbeelding]

Doordat de output nu naar de global thermostat_state is ipv de losse "Evohome_ruimte_PV" etc globals kun je m niet 1-2-3 integreren in je huidige flows. Overigens is dat ook niet de bedoeling, maar dat wordt wel duidelijk in de volgende stappen. De manier waarop ik deze refactoring doe is namelijk om zoveel mogelijk de naamgevingen niet overeen te laten komen met wat je al hebt, zodat je huidige implementatie blijft werken, terwijl je daarnaast de nieuwe delen kunt uitproberen en uiteindelijk samenvoegen en dan kunt omschakelen (weet niet of dat helemaal lukt met het dashboard).

Een andere reden om de naamgevingen aan te passen is om ze wat duidelijker te maken. currentTemperature leest nou eenmaal lekkerder dan PV ;) Ook als alles straks 2 of 3 jaar foutloos zonder aanpassingen werkt en je er dan opeens weer naar moet kijken, dan is het handig als de namen meteen duideljik zijn. Dit is overigens ook een onderdeel van refactoring.
Goed punt. Gelijk een goede naamgeving bedenken is zeker een pre. Ook al omdat je de variabelen niet zomaar even op kunt schonen. Later omzetten kost dus altijd onevenredig veel tijd.
En inderdaad; dat heb ik al een paar keer gedaan ;)
settings.js van Node Red aanpassen

Ik zag in veel van je function nodes dat je daar global.set('EvoHome_woonkamer_PV', Temperatuur, "file") deed om de global op het filesystem op te slaan ipv alleen in memory. Ik vermoed dat je dit onder andere in een function node deed omdat dit normaal niet mogelijk is om in bijv een change node te doen. Die slaat het normaal alleen in memory op.

Het is echter mogelijk om de setttings.js van Node Red aan te passen (niet moeilijk) om ook in nodes zoals de change node een extra optie te krijgen waarbij je kunt kiezen tussen memory of file (alleen bij global en flow variabelen).

[Afbeelding]

Ik heb het gedaan zoals op deze pagina staat en dus het volgende aan mijn settings.js toegevoegd:

code:
1
2
3
4
5
contextStorage: {
   default: "memoryOnly",
   memoryOnly: { module: 'memory' },
   file: { module: 'localfilesystem' }
}



Laat even weten of je hier uit komt, en of het lukt om de evohome-status node in de flow te zetten en dat ie dan werkt (of niet).
Dat is inderdaad een iets makkelijkere manier van gebruik van variabelen.

@edterbak kleine sidestep, maar was je hier ook van op de hoogte? ;)

[ Voor 4% gewijzigd door MikeyMan op 17-07-2023 15:52 ]


Acties:
  • 0 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
@MikeyMan

Je schrijft:
Timestamp komt in de payload, maar daar blijft het bij. Eens kijken wat ik hiermee kan
Ik denk dat je deze regel gemist hebt:

Vervang wel de evohome-status inject node even door de echte evohome-status node. Ik heb geen EvoHome dus die kon ik niet testen, maar denk wel dat het moet werken.

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

musicpixel schreef op maandag 17 juli 2023 @ 16:23:
@MikeyMan

Je schrijft:

[...]


Ik denk dat je deze regel gemist hebt:

Vervang wel de evohome-status inject node even door de echte evohome-status node. Ik heb geen EvoHome dus die kon ik niet testen, maar denk wel dat het moet werken.
Ja die heb ik er (ook) aan hangen. Maar die geeft wat minder vaak waardes ;)

Had ook geprobeerd handmatig topic toe te voegen.

Zal hem morgen even langer laten draaien :)

Acties:
  • +1 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
@MikeyMan

Zie nu dat ik mijn test inject nodes niet gedeeld had.

Met de volgende vier had ik getest bij gebrek aan een echte evohome.
Afbeeldingslocatie: https://tweakers.net/i/QDVs7QgjYqascj01Ww0sOllgOig=/800x/filters:strip_icc():strip_exif()/f/image/bEZgGm4ht4fNGTwh9ZYI3aPy.jpg?f=fotoalbum_large
code:
1
[{"id":"4760db40b5310ed8","type":"inject","z":"59634d1e16095311","name":"EvoHome sample slaapkamer 20","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"id\":\"1234567\",\"name\":\"slaapkamer\",\"currentTemperature\":20,\"targetTemperature\":18,\"systemModeStatus\":{\"mode\":\"Auto\",\"isPermanent\":true}}","payloadType":"json","x":230,"y":1380,"wires":[["d1e9833ae9574ce2"]]},{"id":"11811f37dc4518db","type":"inject","z":"59634d1e16095311","name":"EvoHome sample gym","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"id\":\"1234567\",\"name\":\"gym\",\"currentTemperature\":20,\"targetTemperature\":18,\"systemModeStatus\":{\"mode\":\"Auto\",\"isPermanent\":true}}","payloadType":"json","x":200,"y":1420,"wires":[["d1e9833ae9574ce2"]]},{"id":"12a222e800e3b0d2","type":"inject","z":"59634d1e16095311","name":"EvoHome sample slaapkamer 16","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"id\":\"1234567\",\"name\":\"slaapkamer\",\"currentTemperature\":16,\"targetTemperature\":18,\"systemModeStatus\":{\"mode\":\"Auto\",\"isPermanent\":true}}","payloadType":"json","x":230,"y":1340,"wires":[["d1e9833ae9574ce2"]]},{"id":"8c42f081080d6ba6","type":"inject","z":"59634d1e16095311","name":"EvoHome sample woonkamer","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"id\":\"1234567\",\"name\":\"woonkamer\",\"currentTemperature\":27,\"targetTemperature\":18,\"systemModeStatus\":{\"mode\":\"Auto\",\"isPermanent\":true}}","payloadType":"json","x":220,"y":1460,"wires":[["d1e9833ae9574ce2"]]},{"id":"c9749b146774dfab","type":"comment","z":"59634d1e16095311","name":"EvoHome thermostat (zone) state TEST","info":"","x":230,"y":1300,"wires":[]},{"id":"d1e9833ae9574ce2","type":"junction","z":"59634d1e16095311","x":480,"y":1420,"wires":[["e38e737da2edd5cc"]]}]


Deze kun je naast de evohome-status node hangen als je wilt testen (dus als input voor "Set thermostat_id and msg.topic" node)

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • edterbak
  • Registratie: Maart 2006
  • Laatst online: 21:04
MikeyMan schreef op maandag 17 juli 2023 @ 15:45:
[...]

@edterbak kleine sidestep, maar was je hier ook van op de hoogte? ;)
Welk deel bedoel je precies? Er staat zoveel in die post. :)

Acties:
  • +1 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

edterbak schreef op maandag 17 juli 2023 @ 19:01:
[...]


Welk deel bedoel je precies? Er staat zoveel in die post. :)
Ging specifiek om het gequote deel. Het aanpassen van settings.js zodat je ook met een change node naar file kunt schrijven.

Acties:
  • +1 Henk 'm!

  • edterbak
  • Registratie: Maart 2006
  • Laatst online: 21:04
MikeyMan schreef op maandag 17 juli 2023 @ 19:16:
[...]


Ging specifiek om het gequote deel. Het aanpassen van settings.js zodat je ook met een change node naar file kunt schrijven.
Okay.
Ja, de zelfde code staat ook op de github pagina volgens mij.
Ik maak daar al gebruik van, heel sporadisch.
Dat omdat ik vaak toch al in de functie van alles aan het berekenen ben. Dan is het 1 regel extra om hem daar ook te setten.
In sommige recente nodes zit die change node al om te zetten naar memory en file.
Ondanks dat. Thanks voor de heads up. Ik leer nog graag nieuwe dingen, dus blijf dat doen. :)

Ps. Ik heb in mijn code daar ook een flush commando om de schrijf actie te sturen. Kan handig zijn.

PS2.
Sommige cpu's - OS combo s hebben last van een rounding error.
Soms zie je dat een uitgelezen waarde na berekening ermee in node red 21.100000003 C is. Als je die opslaat....
Floating point error.
Door deze te fixen in de function (in 1klap fixto en set) gaan vergelijken tussen 2 waarden beter. Een fout bron minder in je logica.
Maar dit kan ik mis hebben. Ik ben geen expert. Alleen handig met Google..
@MikeyMan

[ Voor 28% gewijzigd door edterbak op 22-07-2023 01:45 ]


Acties:
  • +1 Henk 'm!

  • MikeyMan
  • Registratie: Februari 2003
  • Laatst online: 22:14

MikeyMan

Vidi, Vici, Veni

@musicpixel working like a charm:

Afbeeldingslocatie: https://tweakers.net/i/xH_-VWw_geaDutUsQ6W6ggPo2-4=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/uD1ltP9iTWEWeUm7jQGx6bWX.png?f=user_large

Acties:
  • 0 Henk 'm!

  • edterbak
  • Registratie: Maart 2006
  • Laatst online: 21:04
Vraagje aan de experts hier.

Ik ben redelijk druk met node red dingen schrijven.

Ik heb een flow geschreven welke ik deel met meerdere mensen, ook onbekenden.
Ik heb voor mijzelf de persistent storage prima op orde. Maar dit is soms een ding dat anderen niet juist voor elkaar krijgen.

Is er een methode om bij een reboot te controleren of persistent storage op orde is?

Ik dacht slim te zijn, en had wat gebouwd dat ogenschijnlijk werkt. Maar dat doet het dus niet.
Het idee: in 1 function node doe ik :
- flow.set('persistency_test','yadayada',"file") opdracht
- var check = flow.get('persistency_test',"file")
- if (check === undefined) {yada}

Hier de flow.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
[
    {
        "id": "5b74b09a9954cbb1",
        "type": "inject",
        "z": "1c393f3f562c11de",
        "name": "",
        "props": [
            {
                "p": "topic",
                "vt": "str"
            },
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": "1",
        "topic": "SYSTEM",
        "payload": "Check",
        "payloadType": "str",
        "x": 320,
        "y": 620,
        "wires": [
            [
                "389b4c604e13a529"
            ]
        ]
    },
    {
        "id": "5bf8aba1afdcadfe",
        "type": "function",
        "z": "1c393f3f562c11de",
        "name": "Testfunction - incorrect location",
        "func": "if (msg.payload == \"Check\")\n {flow.set(\"persistency_test\",msg,\"incorrect_location\");}\n\nvar stored_value = flow.get(\"persistency_test\",\"incorrect_location\");\n\nif (stored_value !== undefined) {\n    node.warn('Stored value found');\n    return null;\n}\n\nelse {\n    node.warn('Stored value not present');\n    msg.payload = \"Persistent storage is not configured correctly. This flow will not function correctly until you do!\";\n    msg.topic = \"SYSTEM WARNING\";\n    return msg;\n}\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 590,
        "y": 700,
        "wires": [
            [
                "b211f96c34c77174"
            ]
        ]
    },
    {
        "id": "b211f96c34c77174",
        "type": "debug",
        "z": "1c393f3f562c11de",
        "name": "debug 191",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 830,
        "y": 660,
        "wires": []
    },
    {
        "id": "389b4c604e13a529",
        "type": "function",
        "z": "1c393f3f562c11de",
        "name": "Testfunction - location file",
        "func": "if (msg.payload == \"Check\")\n {flow.set(\"persistency_test\",msg,\"file\");}\n\nvar stored_value = flow.get(\"persistency_test\",\"file\");\n\nif (stored_value !== undefined) {\n    node.warn('Stored value found');\n    return null;\n}\n\nelse {\n    node.warn('Stored value not present');\n    msg.payload = \"Persistent storage is not configured correctly. This flow will not function correctly until you do!\";\n    msg.topic = \"SYSTEM WARNING\";\n    return msg;\n}\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 570,
        "y": 620,
        "wires": [
            [
                "b211f96c34c77174"
            ]
        ]
    },
    {
        "id": "65ead1b64286eec2",
        "type": "inject",
        "z": "1c393f3f562c11de",
        "name": "",
        "props": [
            {
                "p": "topic",
                "vt": "str"
            },
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": "1",
        "topic": "SYSTEM",
        "payload": "Check",
        "payloadType": "str",
        "x": 320,
        "y": 700,
        "wires": [
            [
                "5bf8aba1afdcadfe"
            ]
        ]
    }
]
Het 'stomme' waar ik tegenaan loop:
Als de persistent storage 'file' aanwezig is, staat de variabele uiteraard netjes onder "file". Dan klopt de uitkomst van de check.
Als de persistent storage 'file' ontbreekt, staat de variable ineens onder "memoryOnly". Je zou verwachten, dan klopt de uitkomst van de check dus niet...

Maar... helaas.

Als de daarop volgende get variable uit de "file" storage wil halen, komt ineens de variabele uit de "memoryOnly" afdeling vandaan. Alsof dat gewoon de bedoeling was.

Probeert Node red hier gewoon te gebruiks vriendelijk te zijn? of maak ik een denkfout ergens? klopt de formule misschien gewoon niet?

Hopelijk zitten hier wat slimmere koppen en weten jullie wel een oplossing. :)

Acties:
  • 0 Henk 'm!

  • BazemanKM
  • Registratie: Januari 2008
  • Laatst online: 23:56
Wie kan helpen? Onderstaande komt via MQTT binnen.
code:
1
{"temp1":"19.4","temp2":"60.5","temp3":"40.8","temp4":"36.5","relayhrs":"42.9","errormask":"888.8","swvers":"999.9"}


Ik zou graag temp1,2,3 en 4 afzonderlijk naar Domoticz/in sturen: idx 61,62,63 en 64

https://www.fam-oldenburger.nl/category/domotica/


  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
BazemanKM schreef op woensdag 6 september 2023 @ 23:33:
Wie kan helpen? Onderstaande komt via MQTT binnen.
code:
1
{"temp1":"19.4","temp2":"60.5","temp3":"40.8","temp4":"36.5","relayhrs":"42.9","errormask":"888.8","swvers":"999.9"}


Ik zou graag temp1,2,3 en 4 afzonderlijk naar Domoticz/in sturen: idx 61,62,63 en 64
Ik denk dat je even naar de split node moet kijken. Die splitst je input vanuit MQTT in 7 losse messages, voor elk key/value pair één.

Daarachter dan een switch (voor temp1-4) en wat change nodes, of anders in een function node (je zou het cijfer uit tempn kunnen ophogen met 60, als de volgorde klopt).

Vervolgens domoticz command samenstellen en versturen.

Zoiets: (heb geen code gedeeld, want dat zit er niet in, is alleen een mockup)
Afbeeldingslocatie: https://tweakers.net/i/6Fio898PKmjxqlx-KD8LAca3-PA=/800x/filters:strip_icc():strip_exif()/f/image/rj5Toz0pZi7a9Swv6rRq6BcW.jpg?f=fotoalbum_large

Feel free to Buy me a coffee


  • BazemanKM
  • Registratie: Januari 2008
  • Laatst online: 23:56
musicpixel schreef op donderdag 7 september 2023 @ 15:52:
[...]


Ik denk dat je even naar de split node moet kijken. Die splitst je input vanuit MQTT in 7 losse messages, voor elk key/value pair één.
Dank, ben zelf ook gaan knutselen en heb onderstaande gemaakt:
Afbeeldingslocatie: https://tweakers.net/i/agXReA5dr2r2wCoztYJGgkPcdmg=/800x/filters:strip_exif()/f/image/xR8V3laNykAOLaHUfkweJBur.png?f=fotoalbum_large

code:
1
[{"id":"8d26cd78404d3ed1","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"0a0ab37845e753b9","type":"mqtt in","z":"8d26cd78404d3ed1","name":"MQTT Resol","topic":"home/resol/#","qos":"2","datatype":"auto-detect","broker":"92e5b2c.00a8b5","nl":false,"rap":false,"inputs":0,"x":170,"y":180,"wires":[["926147d84479b1ee"]]},{"id":"058f7ce5bcb415be","type":"debug","z":"8d26cd78404d3ed1","name":"debug","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":320,"y":240,"wires":[]},{"id":"fbe944c546ddc671","type":"mqtt out","z":"8d26cd78404d3ed1","name":"Domoticz in","topic":"domoticz/in","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"92e5b2c.00a8b5","x":970,"y":180,"wires":[]},{"id":"3ca2d69fff2719fa","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp1","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":100,"wires":[["690dcbaf7caea8b9"]]},{"id":"690dcbaf7caea8b9","type":"function","z":"8d26cd78404d3ed1","name":"function 35","func":"var idx_no = 61\nvar temp = msg.payload.temp1;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":100,"wires":[["fbe944c546ddc671"]]},{"id":"e669c6ab38c0770b","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp2","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":160,"wires":[["f139ef0c784fdadd"]]},{"id":"f139ef0c784fdadd","type":"function","z":"8d26cd78404d3ed1","name":"function 36","func":"var idx_no = 62\nvar temp = msg.payload.temp2;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":160,"wires":[["fbe944c546ddc671"]]},{"id":"96ce2e0cb963ed13","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp3","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":220,"wires":[["481028e602f38bbf"]]},{"id":"7d25fadb8a56cd40","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp4","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":280,"wires":[["cf2d49de50d58738"]]},{"id":"481028e602f38bbf","type":"function","z":"8d26cd78404d3ed1","name":"function 37","func":"var idx_no = 63\nvar temp = msg.payload.temp3;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":220,"wires":[["fbe944c546ddc671"]]},{"id":"cf2d49de50d58738","type":"function","z":"8d26cd78404d3ed1","name":"function 38","func":"var idx_no = 64\nvar temp = msg.payload.temp4;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":280,"wires":[["fbe944c546ddc671"]]},{"id":"926147d84479b1ee","type":"delay","z":"8d26cd78404d3ed1","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"60","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":360,"y":160,"wires":[["3ca2d69fff2719fa","e669c6ab38c0770b","96ce2e0cb963ed13","7d25fadb8a56cd40","058f7ce5bcb415be","ee46379ca2f95261","cec409fee933e51c","b38c7c802de89c1d","0bf9448acc275b03"]]},{"id":"ee46379ca2f95261","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp5","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":340,"wires":[["57419d6e8289b641"]]},{"id":"cec409fee933e51c","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp6","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":400,"wires":[["ce068951b902897a"]]},{"id":"b38c7c802de89c1d","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp7","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":460,"wires":[["40ee3961344a2357"]]},{"id":"0bf9448acc275b03","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp8","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":520,"wires":[["d38cbbc2cdb11b48"]]},{"id":"57419d6e8289b641","type":"function","z":"8d26cd78404d3ed1","name":"function 39","func":"var idx_no = 65\nvar temp = msg.payload.temp5;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":340,"wires":[["fbe944c546ddc671"]]},{"id":"ce068951b902897a","type":"function","z":"8d26cd78404d3ed1","name":"function 40","func":"var idx_no = 66\nvar temp = msg.payload.temp6;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":400,"wires":[["fbe944c546ddc671"]]},{"id":"40ee3961344a2357","type":"function","z":"8d26cd78404d3ed1","name":"function 41","func":"var idx_no = 67\nvar temp = msg.payload.temp7;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":460,"wires":[["fbe944c546ddc671"]]},{"id":"d38cbbc2cdb11b48","type":"function","z":"8d26cd78404d3ed1","name":"function 42","func":"var idx_no = 68\nvar temp = msg.payload.temp8;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":520,"wires":[["fbe944c546ddc671"]]},{"id":"92e5b2c.00a8b5","type":"mqtt-broker","name":"MQTT (localhost)","broker":"localhost","port":"1883","clientid":"Node_Red_Client","usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"sessionExpiry":""}]

https://www.fam-oldenburger.nl/category/domotica/


Acties:
  • +2 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
BazemanKM schreef op donderdag 7 september 2023 @ 17:05:
[...]

Dank, ben zelf ook gaan knutselen en heb onderstaande gemaakt:
[Afbeelding]

code:
1
[{"id":"8d26cd78404d3ed1","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"0a0ab37845e753b9","type":"mqtt in","z":"8d26cd78404d3ed1","name":"MQTT Resol","topic":"home/resol/#","qos":"2","datatype":"auto-detect","broker":"92e5b2c.00a8b5","nl":false,"rap":false,"inputs":0,"x":170,"y":180,"wires":[["926147d84479b1ee"]]},{"id":"058f7ce5bcb415be","type":"debug","z":"8d26cd78404d3ed1","name":"debug","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":320,"y":240,"wires":[]},{"id":"fbe944c546ddc671","type":"mqtt out","z":"8d26cd78404d3ed1","name":"Domoticz in","topic":"domoticz/in","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"92e5b2c.00a8b5","x":970,"y":180,"wires":[]},{"id":"3ca2d69fff2719fa","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp1","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":100,"wires":[["690dcbaf7caea8b9"]]},{"id":"690dcbaf7caea8b9","type":"function","z":"8d26cd78404d3ed1","name":"function 35","func":"var idx_no = 61\nvar temp = msg.payload.temp1;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":100,"wires":[["fbe944c546ddc671"]]},{"id":"e669c6ab38c0770b","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp2","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":160,"wires":[["f139ef0c784fdadd"]]},{"id":"f139ef0c784fdadd","type":"function","z":"8d26cd78404d3ed1","name":"function 36","func":"var idx_no = 62\nvar temp = msg.payload.temp2;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":160,"wires":[["fbe944c546ddc671"]]},{"id":"96ce2e0cb963ed13","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp3","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":220,"wires":[["481028e602f38bbf"]]},{"id":"7d25fadb8a56cd40","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp4","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":280,"wires":[["cf2d49de50d58738"]]},{"id":"481028e602f38bbf","type":"function","z":"8d26cd78404d3ed1","name":"function 37","func":"var idx_no = 63\nvar temp = msg.payload.temp3;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":220,"wires":[["fbe944c546ddc671"]]},{"id":"cf2d49de50d58738","type":"function","z":"8d26cd78404d3ed1","name":"function 38","func":"var idx_no = 64\nvar temp = msg.payload.temp4;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":280,"wires":[["fbe944c546ddc671"]]},{"id":"926147d84479b1ee","type":"delay","z":"8d26cd78404d3ed1","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"60","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":360,"y":160,"wires":[["3ca2d69fff2719fa","e669c6ab38c0770b","96ce2e0cb963ed13","7d25fadb8a56cd40","058f7ce5bcb415be","ee46379ca2f95261","cec409fee933e51c","b38c7c802de89c1d","0bf9448acc275b03"]]},{"id":"ee46379ca2f95261","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp5","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":340,"wires":[["57419d6e8289b641"]]},{"id":"cec409fee933e51c","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp6","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":400,"wires":[["ce068951b902897a"]]},{"id":"b38c7c802de89c1d","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp7","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":460,"wires":[["40ee3961344a2357"]]},{"id":"0bf9448acc275b03","type":"switch","z":"8d26cd78404d3ed1","name":"","property":"payload.temp8","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":550,"y":520,"wires":[["d38cbbc2cdb11b48"]]},{"id":"57419d6e8289b641","type":"function","z":"8d26cd78404d3ed1","name":"function 39","func":"var idx_no = 65\nvar temp = msg.payload.temp5;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":340,"wires":[["fbe944c546ddc671"]]},{"id":"ce068951b902897a","type":"function","z":"8d26cd78404d3ed1","name":"function 40","func":"var idx_no = 66\nvar temp = msg.payload.temp6;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":400,"wires":[["fbe944c546ddc671"]]},{"id":"40ee3961344a2357","type":"function","z":"8d26cd78404d3ed1","name":"function 41","func":"var idx_no = 67\nvar temp = msg.payload.temp7;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":460,"wires":[["fbe944c546ddc671"]]},{"id":"d38cbbc2cdb11b48","type":"function","z":"8d26cd78404d3ed1","name":"function 42","func":"var idx_no = 68\nvar temp = msg.payload.temp8;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":520,"wires":[["fbe944c546ddc671"]]},{"id":"92e5b2c.00a8b5","type":"mqtt-broker","name":"MQTT (localhost)","broker":"localhost","port":"1883","clientid":"Node_Red_Client","usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"sessionExpiry":""}]
Als het werkt is het prima natuurlijk, maar het viel me op dat al die switches en functions inhoudelijk vrijwel hetzelfde zijn. Met name het maken van het domoticz commando werd steeds herhaald.

Ik hou zelf nooit zo van dubbele code dus ik wilde je daarom een alternatief laten zien waarbij ik de spllit gebruik en het nummertje dat achter "temp" staat er uit haal en gebruik om idx te berekenen. Ook is er nu maar 1 function node die het domoticz commando berekent (en alleen dat). Elke node is nu ook maar verantwoordelijk voor 1 ding.

Meerdere manieren om hetzelfde te bereiken dus... ;)

Afbeeldingslocatie: https://tweakers.net/i/ZrPpbmDs0-FX07oX41XcxyzLI4U=/800x/filters:strip_icc():strip_exif()/f/image/rT94xjgPz5siPAuYaSkpvegU.jpg?f=fotoalbum_large

code:
1
[{"id":"56bac9eef9d72445","type":"inject","z":"8d26cd78404d3ed1","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"temp1\":\"19.4\",\"temp2\":\"60.5\",\"temp3\":\"40.8\",\"temp4\":\"36.5\",\"relayhrs\":\"42.9\",\"errormask\":\"888.8\",\"swvers\":\"999.9\"}","payloadType":"json","x":150,"y":880,"wires":[["a0dd8230ce2be18b"]]},{"id":"08b13065e51011b8","type":"split","z":"8d26cd78404d3ed1","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":530,"y":880,"wires":[["ced6169a50a59ad1"]]},{"id":"72ffad4e2321c077","type":"debug","z":"8d26cd78404d3ed1","name":"debug 226","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1870,"y":940,"wires":[]},{"id":"ced6169a50a59ad1","type":"function","z":"8d26cd78404d3ed1","name":"Get \"temp\" id and value","func":"// get the key/value pair\nvar key = msg.parts.key;\nvar value = msg.payload;\n\n// get first 4 chars of key and check if it is \"temp\"\nvar left4 = key.substr(0, 4);\nif (left4 == \"temp\")\n{\n    // determine id (= number after \"temp\")\n    msg.temperature_id = parseInt(key.substr(4));   // temp id\n    // convert temperature value from string to float number\n    msg.temperature_value = parseFloat(value);\n}\nelse // if it not starts with \"temp\", then id == 0\n{\n    msg.temperature_id = 0;\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":880,"wires":[["b0d855c7a9ac762c"]]},{"id":"b0d855c7a9ac762c","type":"switch","z":"8d26cd78404d3ed1","name":"\"temp\" id > 0?","property":"temperature_id","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"num"}],"checkall":"true","repair":false,"outputs":1,"x":1040,"y":880,"wires":[["786f57b5230387f4"]]},{"id":"6e2b33d89fda65da","type":"function","z":"8d26cd78404d3ed1","name":"prepare domoticz command","func":"var idx_no = msg.domoticz_idx;\nvar temp = msg.temperature_value;\n\nmsg.payload = `{\\n \"command\":\"udevice\",\"idx\" : ${idx_no}, \"svalue\" : \"${temp}\"\\n}`;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1600,"y":880,"wires":[["72ffad4e2321c077","89278c7aec473920"]]},{"id":"786f57b5230387f4","type":"change","z":"8d26cd78404d3ed1","name":"","rules":[{"t":"set","p":"domoticz_idx","pt":"msg","to":"$.temperature_id + 60","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":1300,"y":880,"wires":[["6e2b33d89fda65da"]]},{"id":"89278c7aec473920","type":"mqtt out","z":"8d26cd78404d3ed1","name":"Domoticz in","topic":"domoticz/in","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"92e5b2c.00a8b5","x":1910,"y":880,"wires":[]},{"id":"a0dd8230ce2be18b","type":"delay","z":"8d26cd78404d3ed1","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"60","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":340,"y":880,"wires":[["08b13065e51011b8"]]},{"id":"92e5b2c.00a8b5","type":"mqtt-broker","name":"MQTT (NAS)","broker":"10.0.0.4","port":"1883","clientid":"Node_Red_Client","autoConnect":true,"usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}]

Feel free to Buy me a coffee


Acties:
  • +1 Henk 'm!

  • BazemanKM
  • Registratie: Januari 2008
  • Laatst online: 23:56
musicpixel schreef op vrijdag 8 september 2023 @ 13:57:
[...]

Als het werkt is het prima natuurlijk, maar het viel me op dat al die switches en functions inhoudelijk vrijwel hetzelfde zijn. Met name het maken van het domoticz commando werd steeds herhaald.

Meerdere manieren om hetzelfde te bereiken dus... ;)
De flow van jou werkt ook, qua code is de function node voor mij wat ingewikkelder, maar van die jou leer ik mooi, bedankt.

https://www.fam-oldenburger.nl/category/domotica/


  • Toppe
  • Registratie: Januari 2004
  • Laatst online: 07:18
Goedemiddag,

Bij ons op het werk zijn we bezig met slimmigheden, deze zijn gebaseerd op het LoRa protocol. Ik heb niet direct de mogelijkheid om een eigen server hier voor op te zetten maar de gateway ondersteund Node-Red. Er zit ook een ingebouwde LoRa mogelijkheid in. De handleiding is hier te vinden.

Nu ben ik daar alleen mee bezig maar probleem is dat alle test apparatuur die ik voor handen heb slechts elke 24 uur een signaal versturen. Ik wil daar niet op wachten.

De verbinding naar de MQTT broker heb ik al gemaakt en dat werkt ook, nu ben ik alleen opzoek naar de mogelijkheid om de berichten 'op te slaan' zodat ik later weet waar ik naar zoek.

Iemand enig idee of dit mogelijk is?

Donstil: Je moet kopen wat je wilt hebben. Niet wat je nodig hebt!


Acties:
  • +1 Henk 'm!
@Toppe Daar is de retain functie van MQTT dan voor denk ik?

Acties:
  • 0 Henk 'm!

  • LJ80
  • Registratie: Februari 2007
  • Laatst online: 23-07 16:08
Hallo Allemaal,

Hopelijk kan en wil iemand me hiermee helpen.
In node red, home assistant heb ik een flow gemaakt waar mijn screens in de huiskamer gebaseerd op het weer vanzelf open of dicht gaan. Ik zal even uitleggen wat ik gemaakt heb.
Afbeeldingslocatie: https://tweakers.net/i/ExLcdlgsV58Gjnj8tAlyIvDQa3o=/800x/filters:strip_icc():strip_exif()/f/image/It6F1uwcYaFyqfIOBpc2ssaE.jpg?f=fotoalbum_large

Er wordt eerst elke 15 minuten gekeken naar 1 zonnepaneel op mijn dak.
En als de gemeten opgewekte zonnenergie boven de >250 is dan gaat de flow lopen.
Daarna wordt er gekeken of het wel binnen een bepaald tijdsbestek valt, en dan de screens open en dicht. Met nog eens een herhaling 5 seconden later mocht het radiosignaal (somfy) gemist worden.

Het werkt perfect.
Op 1 ding na, dat als het bewolkt is het zo kan zijn dat de screens elke 15 minuten open en weer dicht gaan. Daarom heb ik het stuktje switch msg reset toegevoegd met een trigger. Dit zou volgens mij moeten helpen dat hij na tien minuten kijkt of de waarde nog steeds boven de 250 ligt en dan pas de screens laat zakken. Dit heb ik gedaan gebaseerd op deze post:

https://www.reddit.com/r/...en_value_above_threshold/

Ik denk alleen dat ik iets niet goed heb ingesteld want volgens mij werkt dit stukje niet.
Wie kan even met me meedenken?

De switch node ziet er zo uit:
Afbeeldingslocatie: https://tweakers.net/i/ErcxqoW_lyxjX_AkCgChhnoMABw=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/RzsBty0xrx1yI8TrfJ4SIMaF.jpg?f=user_large

De msg.reset ziet er zo uit:
Afbeeldingslocatie: https://tweakers.net/i/rHaVXH3QQAc6_jz5vcocss2JSAg=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/XevaYibvUsyOkjrwA2LwVYrO.jpg?f=user_large

De trigger ziet er zo uit:
Afbeeldingslocatie: https://tweakers.net/i/-cTscZU9-Fkih2YmJXHwO5vGa1U=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/NJ8GvgUfsvwl6mkre3bDpbOR.jpg?f=user_large

Hopelijk ziet iemand wat er niet zou kloppen en kan me hiermee helpen.
Bedankt alvast.


code:
1
[{"id":"595682c3b0c8a7f8","type":"api-call-service","z":"51e31d4afbd9f236","name":"Screen HK open","server":"8148d47f.2939f8","version":5,"debugenabled":false,"domain":"cover","service":"open_cover","areaId":[],"deviceId":["778d5bf86b662858b993237db19b9ed5"],"entityId":["switch.screens_hk"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":860,"y":500,"wires":[["8d32dcc59ba43e53"]]},{"id":"a85d603fc6c69520","type":"inject","z":"51e31d4afbd9f236","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":660,"y":580,"wires":[["595682c3b0c8a7f8"]]},{"id":"49e831072a2fcab2","type":"api-call-service","z":"51e31d4afbd9f236","name":"Screen HK dicht","server":"8148d47f.2939f8","version":5,"debugenabled":false,"domain":"cover","service":"close_cover","areaId":[],"deviceId":["778d5bf86b662858b993237db19b9ed5"],"entityId":["switch.screens_hk"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":860,"y":380,"wires":[["01118bd5b4d1f1ac"]]},{"id":"3db1c0401a64751d","type":"inject","z":"51e31d4afbd9f236","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":660,"y":420,"wires":[["49e831072a2fcab2"]]},{"id":"c02a20dd4235ad83","type":"schedex","z":"51e31d4afbd9f236","name":"open om 23:00","passthroughunhandled":false,"suspended":false,"lat":"51.988810","lon":"4.203090","ontime":"23:00","ontopic":"","onpayload":"off","onoffset":"10","onrandomoffset":true,"offtime":"","offtopic":"","offpayload":"","offoffset":0,"offrandomoffset":0,"mon":true,"tue":true,"wed":true,"thu":true,"fri":true,"sat":true,"sun":true,"x":380,"y":580,"wires":[["595682c3b0c8a7f8"]]},{"id":"fdd2339d7a72454a","type":"time-range-switch","z":"51e31d4afbd9f236","name":"","lat":"51.988810","lon":"4.203090","startTime":"solarNoon","endTime":"goldenHour","startOffset":"-240","endOffset":"-120","x":410,"y":340,"wires":[["42f6f9aa6cfdf634"],[]]},{"id":"10203b88acf6a623","type":"time-range-switch","z":"51e31d4afbd9f236","name":"","lat":"51.988810","lon":"4.203090","startTime":"solarNoon","endTime":"goldenHour","startOffset":"-240","endOffset":"-120","x":410,"y":500,"wires":[["595682c3b0c8a7f8"],[]]},{"id":"c7c2d286f095a53f","type":"poll-state","z":"51e31d4afbd9f236","name":" 122250026903 zonnepaneel","server":"8148d47f.2939f8","version":2,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"updateinterval":"15","updateIntervalType":"num","updateIntervalUnits":"minutes","outputinitially":false,"outputonchanged":false,"entity_id":"sensor.inverter_122250026903","state_type":"str","halt_if":"250","halt_if_type":"num","halt_if_compare":"gt","outputs":2,"x":160,"y":420,"wires":[["fdd2339d7a72454a"],["10203b88acf6a623"]]},{"id":"63885ea04db35e56","type":"poll-state","z":"51e31d4afbd9f236","name":"Fog","server":"8148d47f.2939f8","version":2,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"updateinterval":"60","updateIntervalType":"num","updateIntervalUnits":"seconds","outputinitially":false,"outputonchanged":false,"entity_id":"weather.home_assistant","state_type":"str","halt_if":"Fog","halt_if_type":"str","halt_if_compare":"is","outputs":2,"x":90,"y":540,"wires":[["10203b88acf6a623"],[]]},{"id":"2ef77cdfce755b3b","type":"poll-state","z":"51e31d4afbd9f236","name":"Cloudy","server":"8148d47f.2939f8","version":2,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"updateinterval":"60","updateIntervalType":"num","updateIntervalUnits":"seconds","outputinitially":false,"outputonchanged":false,"entity_id":"weather.home_assistant","state_type":"str","halt_if":"Cloudy","halt_if_type":"str","halt_if_compare":"is","outputs":2,"x":90,"y":600,"wires":[["10203b88acf6a623"],[]]},{"id":"65b37ec20195d13f","type":"poll-state","z":"51e31d4afbd9f236","name":"Rainy","server":"8148d47f.2939f8","version":2,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"updateinterval":"60","updateIntervalType":"num","updateIntervalUnits":"seconds","outputinitially":false,"outputonchanged":false,"entity_id":"weather.home_assistant","state_type":"str","halt_if":"rainy","halt_if_type":"str","halt_if_compare":"is","outputs":2,"x":90,"y":660,"wires":[["10203b88acf6a623"],[]]},{"id":"01118bd5b4d1f1ac","type":"delay","z":"51e31d4afbd9f236","name":"5sec delay","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1050,"y":380,"wires":[["cb55ab0371858865"]]},{"id":"8d32dcc59ba43e53","type":"delay","z":"51e31d4afbd9f236","name":"5sec delay","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1070,"y":500,"wires":[["8ff842c02ab2ca65"]]},{"id":"cb55ab0371858865","type":"api-call-service","z":"51e31d4afbd9f236","name":"Screen HK dicht","server":"8148d47f.2939f8","version":5,"debugenabled":false,"domain":"cover","service":"close_cover","areaId":[],"deviceId":["778d5bf86b662858b993237db19b9ed5"],"entityId":["switch.screens_hk"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1240,"y":380,"wires":[[]]},{"id":"8ff842c02ab2ca65","type":"api-call-service","z":"51e31d4afbd9f236","name":"Screen HK open","server":"8148d47f.2939f8","version":5,"debugenabled":false,"domain":"cover","service":"open_cover","areaId":[],"deviceId":["778d5bf86b662858b993237db19b9ed5"],"entityId":["switch.screens_hk"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1260,"y":500,"wires":[[]]},{"id":"42f6f9aa6cfdf634","type":"switch","z":"51e31d4afbd9f236","name":"","property":"payload","propertyType":"msg","rules":[{"t":"gt","v":"250","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":610,"y":300,"wires":[["60c4aea90a66cc53","22bba3beba994e7b"]]},{"id":"22bba3beba994e7b","type":"change","z":"51e31d4afbd9f236","name":"msg.reset","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":740,"y":200,"wires":[["60c4aea90a66cc53"]]},{"id":"60c4aea90a66cc53","type":"trigger","z":"51e31d4afbd9f236","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"10","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":810,"y":300,"wires":[["49e831072a2fcab2"]]},{"id":"8148d47f.2939f8","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]

[ Voor 60% gewijzigd door LJ80 op 01-10-2023 14:52 ]


Acties:
  • 0 Henk 'm!

  • denuz
  • Registratie: Augustus 2006
  • Laatst online: 02:41
LJ80 schreef op zondag 1 oktober 2023 @ 14:51:
Hallo Allemaal,

Hopelijk kan en wil iemand me hiermee helpen.
In node red, home assistant heb ik een flow gemaakt waar mijn screens in de huiskamer gebaseerd op het weer vanzelf open of dicht gaan. Ik zal even uitleggen wat ik gemaakt heb.
[Afbeelding]

Er wordt eerst elke 15 minuten gekeken naar 1 zonnepaneel op mijn dak.
En als de gemeten opgewekte zonnenergie boven de >250 is dan gaat de flow lopen.
Daarna wordt er gekeken of het wel binnen een bepaald tijdsbestek valt, en dan de screens open en dicht. Met nog eens een herhaling 5 seconden later mocht het radiosignaal (somfy) gemist worden.

Het werkt perfect.
Op 1 ding na, dat als het bewolkt is het zo kan zijn dat de screens elke 15 minuten open en weer dicht gaan. Daarom heb ik het stuktje switch msg reset toegevoegd met een trigger. Dit zou volgens mij moeten helpen dat hij na tien minuten kijkt of de waarde nog steeds boven de 250 ligt en dan pas de screens laat zakken. Dit heb ik gedaan gebaseerd op deze post:

https://www.reddit.com/r/...en_value_above_threshold/

Ik denk alleen dat ik iets niet goed heb ingesteld want volgens mij werkt dit stukje niet.
Wie kan even met me meedenken?

De switch node ziet er zo uit:
[Afbeelding]

De msg.reset ziet er zo uit:
[Afbeelding]

De trigger ziet er zo uit:
[Afbeelding]

Hopelijk ziet iemand wat er niet zou kloppen en kan me hiermee helpen.
Bedankt alvast.


code:
1
[{"id":"595682c3b0c8a7f8","type":"api-call-service","z":"51e31d4afbd9f236","name":"Screen HK open","server":"8148d47f.2939f8","version":5,"debugenabled":false,"domain":"cover","service":"open_cover","areaId":[],"deviceId":["778d5bf86b662858b993237db19b9ed5"],"entityId":["switch.screens_hk"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":860,"y":500,"wires":[["8d32dcc59ba43e53"]]},{"id":"a85d603fc6c69520","type":"inject","z":"51e31d4afbd9f236","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":660,"y":580,"wires":[["595682c3b0c8a7f8"]]},{"id":"49e831072a2fcab2","type":"api-call-service","z":"51e31d4afbd9f236","name":"Screen HK dicht","server":"8148d47f.2939f8","version":5,"debugenabled":false,"domain":"cover","service":"close_cover","areaId":[],"deviceId":["778d5bf86b662858b993237db19b9ed5"],"entityId":["switch.screens_hk"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":860,"y":380,"wires":[["01118bd5b4d1f1ac"]]},{"id":"3db1c0401a64751d","type":"inject","z":"51e31d4afbd9f236","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":660,"y":420,"wires":[["49e831072a2fcab2"]]},{"id":"c02a20dd4235ad83","type":"schedex","z":"51e31d4afbd9f236","name":"open om 23:00","passthroughunhandled":false,"suspended":false,"lat":"51.988810","lon":"4.203090","ontime":"23:00","ontopic":"","onpayload":"off","onoffset":"10","onrandomoffset":true,"offtime":"","offtopic":"","offpayload":"","offoffset":0,"offrandomoffset":0,"mon":true,"tue":true,"wed":true,"thu":true,"fri":true,"sat":true,"sun":true,"x":380,"y":580,"wires":[["595682c3b0c8a7f8"]]},{"id":"fdd2339d7a72454a","type":"time-range-switch","z":"51e31d4afbd9f236","name":"","lat":"51.988810","lon":"4.203090","startTime":"solarNoon","endTime":"goldenHour","startOffset":"-240","endOffset":"-120","x":410,"y":340,"wires":[["42f6f9aa6cfdf634"],[]]},{"id":"10203b88acf6a623","type":"time-range-switch","z":"51e31d4afbd9f236","name":"","lat":"51.988810","lon":"4.203090","startTime":"solarNoon","endTime":"goldenHour","startOffset":"-240","endOffset":"-120","x":410,"y":500,"wires":[["595682c3b0c8a7f8"],[]]},{"id":"c7c2d286f095a53f","type":"poll-state","z":"51e31d4afbd9f236","name":" 122250026903 zonnepaneel","server":"8148d47f.2939f8","version":2,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"updateinterval":"15","updateIntervalType":"num","updateIntervalUnits":"minutes","outputinitially":false,"outputonchanged":false,"entity_id":"sensor.inverter_122250026903","state_type":"str","halt_if":"250","halt_if_type":"num","halt_if_compare":"gt","outputs":2,"x":160,"y":420,"wires":[["fdd2339d7a72454a"],["10203b88acf6a623"]]},{"id":"63885ea04db35e56","type":"poll-state","z":"51e31d4afbd9f236","name":"Fog","server":"8148d47f.2939f8","version":2,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"updateinterval":"60","updateIntervalType":"num","updateIntervalUnits":"seconds","outputinitially":false,"outputonchanged":false,"entity_id":"weather.home_assistant","state_type":"str","halt_if":"Fog","halt_if_type":"str","halt_if_compare":"is","outputs":2,"x":90,"y":540,"wires":[["10203b88acf6a623"],[]]},{"id":"2ef77cdfce755b3b","type":"poll-state","z":"51e31d4afbd9f236","name":"Cloudy","server":"8148d47f.2939f8","version":2,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"updateinterval":"60","updateIntervalType":"num","updateIntervalUnits":"seconds","outputinitially":false,"outputonchanged":false,"entity_id":"weather.home_assistant","state_type":"str","halt_if":"Cloudy","halt_if_type":"str","halt_if_compare":"is","outputs":2,"x":90,"y":600,"wires":[["10203b88acf6a623"],[]]},{"id":"65b37ec20195d13f","type":"poll-state","z":"51e31d4afbd9f236","name":"Rainy","server":"8148d47f.2939f8","version":2,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"updateinterval":"60","updateIntervalType":"num","updateIntervalUnits":"seconds","outputinitially":false,"outputonchanged":false,"entity_id":"weather.home_assistant","state_type":"str","halt_if":"rainy","halt_if_type":"str","halt_if_compare":"is","outputs":2,"x":90,"y":660,"wires":[["10203b88acf6a623"],[]]},{"id":"01118bd5b4d1f1ac","type":"delay","z":"51e31d4afbd9f236","name":"5sec delay","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1050,"y":380,"wires":[["cb55ab0371858865"]]},{"id":"8d32dcc59ba43e53","type":"delay","z":"51e31d4afbd9f236","name":"5sec delay","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1070,"y":500,"wires":[["8ff842c02ab2ca65"]]},{"id":"cb55ab0371858865","type":"api-call-service","z":"51e31d4afbd9f236","name":"Screen HK dicht","server":"8148d47f.2939f8","version":5,"debugenabled":false,"domain":"cover","service":"close_cover","areaId":[],"deviceId":["778d5bf86b662858b993237db19b9ed5"],"entityId":["switch.screens_hk"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1240,"y":380,"wires":[[]]},{"id":"8ff842c02ab2ca65","type":"api-call-service","z":"51e31d4afbd9f236","name":"Screen HK open","server":"8148d47f.2939f8","version":5,"debugenabled":false,"domain":"cover","service":"open_cover","areaId":[],"deviceId":["778d5bf86b662858b993237db19b9ed5"],"entityId":["switch.screens_hk"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1260,"y":500,"wires":[[]]},{"id":"42f6f9aa6cfdf634","type":"switch","z":"51e31d4afbd9f236","name":"","property":"payload","propertyType":"msg","rules":[{"t":"gt","v":"250","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":610,"y":300,"wires":[["60c4aea90a66cc53","22bba3beba994e7b"]]},{"id":"22bba3beba994e7b","type":"change","z":"51e31d4afbd9f236","name":"msg.reset","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":740,"y":200,"wires":[["60c4aea90a66cc53"]]},{"id":"60c4aea90a66cc53","type":"trigger","z":"51e31d4afbd9f236","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"10","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":810,"y":300,"wires":[["49e831072a2fcab2"]]},{"id":"8148d47f.2939f8","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]
Je trigger stuurt nu direct waarde 1 en na 10 minuten waard 0, als deze niet wordt gereset.
Gezien er in je switch maar 1 waarde staat, wordt de trigger meteen gereset.
Ik zou de trigger weghalen, ook de 15 minuten poll.
Beter is te triggeren op waarde van zonnepaneel. Deze node heeft ook de 'for ' ingebouwd.
Doe je 1x > 250 for 15 min voor sluiten,en nog een losse < 250 for 15 openen.

Acties:
  • 0 Henk 'm!

  • LJ80
  • Registratie: Februari 2007
  • Laatst online: 23-07 16:08
denuz schreef op zondag 1 oktober 2023 @ 17:05:
[...]

Je trigger stuurt nu direct waarde 1 en na 10 minuten waard 0, als deze niet wordt gereset.
Gezien er in je switch maar 1 waarde staat, wordt de trigger meteen gereset.
Ik zou de trigger weghalen, ook de 15 minuten poll.
Beter is te triggeren op waarde van zonnepaneel. Deze node heeft ook de 'for ' ingebouwd.
Doe je 1x > 250 for 15 min voor sluiten,en nog een losse < 250 for 15 openen.
Bedankt voor je reactie!
Maar bij welke node kan ik ook "for" vinden dan?

Afbeeldingslocatie: https://tweakers.net/i/Y5Pk8BDzvHSmmXSzSDZqE7N_gFc=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/Xo7fb3gBA3EahyS6inKA2Iwy.jpg?f=user_large

Hier zie ik dat namelijk niet.

Acties:
  • +1 Henk 'm!

  • denuz
  • Registratie: Augustus 2006
  • Laatst online: 02:41
@LJ80 Afbeeldingslocatie: https://tweakers.net/i/_HhtxIDKkIkKMCSeblm7CVkluGY=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/BVtlefvBsouBm30NJG21TCL8.png?f=user_large
Ah, voor de waarde gebruik je de 'events state node'

Acties:
  • 0 Henk 'm!

  • LJ80
  • Registratie: Februari 2007
  • Laatst online: 23-07 16:08
denuz schreef op zondag 1 oktober 2023 @ 20:01:
@LJ80 [Afbeelding]
Ah, voor de waarde gebruik je de 'events state node'
Ah ik snap je.
Tnx, ga ik het met die node proberen.
Dat zijn er een paar minder dan.

Acties:
  • 0 Henk 'm!

  • Obelixxx
  • Registratie: Juli 2020
  • Laatst online: 19-09 16:00
Hallo,

Ik ben al een paar dagen aan het knutselen, maar kom helaas niet echt tot mijn oplossing in Home Assistant.

Mijn buitenverlichting wordt aan en uitgeschakelt op basis van Zons opgang, ondergang icm Bigtimer.
Nu wil ik graag een motionsensor gebruiken om mijn verlichting tussen zonsondergang en ondergang naar 100% te schakelen voor 15 minuten, Dit stukje nog geen probleem.

Maar ik wil graag na de 15 minuten weer terug naar de stand die ik had voordat er motion was. (stand off of stand 35%)

Kan iemand me hierbij helpen?

Acties:
  • +1 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
Obelixxx schreef op maandag 9 oktober 2023 @ 08:32:
Hallo,

Ik ben al een paar dagen aan het knutselen, maar kom helaas niet echt tot mijn oplossing in Home Assistant.

Mijn buitenverlichting wordt aan en uitgeschakelt op basis van Zons opgang, ondergang icm Bigtimer.
Nu wil ik graag een motionsensor gebruiken om mijn verlichting tussen zonsondergang en ondergang naar 100% te schakelen voor 15 minuten, Dit stukje nog geen probleem.

Maar ik wil graag na de 15 minuten weer terug naar de stand die ik had voordat er motion was. (stand off of stand 35%)

Kan iemand me hierbij helpen?
Ik zou even kijken naar scene snapshots:
https://www.home-assistant.io/integrations/scene/
(bekijk vooral de video daar)

Hou wel rekening met de situatie dat je bijv 5 minuten voor zonsopgang de motion sensor activeert en dat 15 min later dus de zon op is en je eigenljik niet terug wilt naar de "vorige" stand, maar naar "uit".

[ Voor 11% gewijzigd door musicpixel op 09-10-2023 09:02 ]

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • JW te R
  • Registratie: April 2010
  • Laatst online: 20:25
Hallo allemaal,

Ik weet even niet of ik met mijn vraag in het juiste subforum zit. Ik heb een installatie die via Node-Red meetwaarden verzamelt, en wil die in een (tijdreeks)database opslaan. Ik heb via node-red-contrib-influxdb geexperimenteerd met Influxdb versie 2, waarbij het opvragen van data via Flux moet. Dat lukt op zich wel, maar gaat buitengewoon moeizaam. Op de website van Influxdata zie ik dat men gaat overstappen van Flux op InfluxQL. Bij Flux krijg je een popup met de melding 'Flux is going into maintenance mode'. InfluxQL ziet er op zich uit als een verbetering, maar gebruik daarvan zou moeten samenvallen met een update naar InfluxDB 3.0, die voor zover ik kan zien alleen via de cloud gaat werken, of via een duurbetaald abonnement. En dat wil ik niet. Klopt dit, of zie ik iets over het hoofd? En welke alternatieven zijn er eventueel mogelijk?

Acties:
  • +1 Henk 'm!

  • Step5
  • Registratie: Oktober 2011
  • Laatst online: 18-09 23:08
JW te R schreef op maandag 16 oktober 2023 @ 15:22:
Hallo allemaal,

Ik weet even niet of ik met mijn vraag in het juiste subforum zit. Ik heb een installatie die via Node-Red meetwaarden verzamelt, en wil die in een (tijdreeks)database opslaan. Ik heb via node-red-contrib-influxdb geexperimenteerd met Influxdb versie 2, waarbij het opvragen van data via Flux moet. Dat lukt op zich wel, maar gaat buitengewoon moeizaam. Op de website van Influxdata zie ik dat men gaat overstappen van Flux op InfluxQL. Bij Flux krijg je een popup met de melding 'Flux is going into maintenance mode'. InfluxQL ziet er op zich uit als een verbetering, maar gebruik daarvan zou moeten samenvallen met een update naar InfluxDB 3.0, die voor zover ik kan zien alleen via de cloud gaat werken, of via een duurbetaald abonnement. En dat wil ik niet. Klopt dit, of zie ik iets over het hoofd? En welke alternatieven zijn er eventueel mogelijk?
Ik zit er niet zo diep in, maar het lijkt er op dat 3.0 een community versie krijgt, die v1 en v2 vervangt. https://www.influxdata.co...influxdb-3-0-open-source/

Acties:
  • 0 Henk 'm!

  • CodeBaker
  • Registratie: November 2022
  • Laatst online: 17-09 15:54
Hallo, ik heb een node-red flow gebouwd waarin ik in een notify de trein tijden door krijg. Hierbij wil ik ook de gevoelstemperatuur in een notify laten tonen. Nu heb ik de logica in een function node gedaan. en wil ik de payload mee geven in mijn message van de notify. maar tot nu toe krijg ik mijn payload niet in mn message. Wat doe ik verkeerd?

hier de flow:

code:
1
[{"id":"8bbc24c537243671","type":"inject","z":"eff08008135be678","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":260,"wires":[["d6075fe58faf7e6c","a91bdb146324f9a6"]]},{"id":"d6075fe58faf7e6c","type":"api-current-state","z":"eff08008135be678","name":"Departure time planned","server":"2ac5e9467e57d943","version":3,"outputs":2,"halt_if":"$entity().attributes.departure_time_planned","halt_if_type":"jsonata","halt_if_compare":"jsonata","entity_id":"sensor.feanwalden_groningen_the_07h24m_train","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"entity"},{"property":"payload","propertyType":"msg","value":"{ \"departure_time_planned\": $entity().attributes.departure_time_planned }","valueType":"jsonata"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":370,"y":260,"wires":[[],["a91bdb146324f9a6"]]},{"id":"a91bdb146324f9a6","type":"api-current-state","z":"eff08008135be678","name":"Feel temperature","server":"2ac5e9467e57d943","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.buienradar_feel_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"entity"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":430,"y":400,"wires":[["0a469bdff4f8430d"]]},{"id":"0a469bdff4f8430d","type":"api-current-state","z":"eff08008135be678","name":"Train sensor","server":"2ac5e9467e57d943","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.feanwalden_groningen","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"entity"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":650,"y":500,"wires":[["02400e41f2d4d860"]]},{"id":"02400e41f2d4d860","type":"function","z":"eff08008135be678","name":"JS","func":"var moment = global.get('moment');\nvar currentTime = msg.payload;\nvar targetTime = moment('07:19:00', 'HH:mm:ss');\n\nif (moment(currentTime, 'HH:mm:ss').isBefore(targetTime)) {\n    // Current time is before 7:25\n\n    if (msg.payload && msg.departure_time_planned) {\n        var departureTime = msg.departure_time_planned;\n\n        msg.payload.departure = departureTime;\n\n        var weatherTemperature = msg.buienradar_feel_temperature;\n\n        msg.payload.weatherTemperature = weatherTemperature;\n\n        msg.payload = \"The train is on time and leaves on: \" + msg.departure + \". The Outside temperature is \" + msg.weatherTemperature + \"°C\";\n        \n    } else {\n\n        node.error(\"Missing or invalid data in msg.payload\");\n    }\n}\n\nreturn msg.payload = \"The train is on time and leaves on: \" + msg.departure + \". The Outside temperature is \" + msg.weatherTemperature & \"°C\";","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"moment","module":"moment"}],"x":870,"y":320,"wires":[["29abe4afdf2e5645"]]},{"id":"29abe4afdf2e5645","type":"api-call-service","z":"eff08008135be678","name":"Notify mobile","server":"2ac5e9467e57d943","version":5,"debugenabled":false,"domain":"notify","service":"mobile_app_iphone_van_willem","areaId":[],"deviceId":[],"entityId":[],"data":"{\t    \"message\":  payload}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1110,"y":240,"wires":[["797e77afcb16f5fe"]]},{"id":"797e77afcb16f5fe","type":"debug","z":"eff08008135be678","name":"debug 13","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1360,"y":320,"wires":[]},{"id":"2ac5e9467e57d943","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":": ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"default","statusTimeFormat":"h:m","enableGlobalContextStore":false}]

Acties:
  • 0 Henk 'm!

  • denuz
  • Registratie: Augustus 2006
  • Laatst online: 02:41
CodeBaker schreef op vrijdag 20 oktober 2023 @ 09:19:
Hallo, ik heb een node-red flow gebouwd waarin ik in een notify de trein tijden door krijg. Hierbij wil ik ook de gevoelstemperatuur in een notify laten tonen. Nu heb ik de logica in een function node gedaan. en wil ik de payload mee geven in mijn message van de notify. maar tot nu toe krijg ik mijn payload niet in mn message. Wat doe ik verkeerd?

hier de flow:

code:
1
[{"id":"8bbc24c537243671","type":"inject","z":"eff08008135be678","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":260,"wires":[["d6075fe58faf7e6c","a91bdb146324f9a6"]]},{"id":"d6075fe58faf7e6c","type":"api-current-state","z":"eff08008135be678","name":"Departure time planned","server":"2ac5e9467e57d943","version":3,"outputs":2,"halt_if":"$entity().attributes.departure_time_planned","halt_if_type":"jsonata","halt_if_compare":"jsonata","entity_id":"sensor.feanwalden_groningen_the_07h24m_train","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"entity"},{"property":"payload","propertyType":"msg","value":"{ \"departure_time_planned\": $entity().attributes.departure_time_planned }","valueType":"jsonata"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":370,"y":260,"wires":[[],["a91bdb146324f9a6"]]},{"id":"a91bdb146324f9a6","type":"api-current-state","z":"eff08008135be678","name":"Feel temperature","server":"2ac5e9467e57d943","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.buienradar_feel_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"entity"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":430,"y":400,"wires":[["0a469bdff4f8430d"]]},{"id":"0a469bdff4f8430d","type":"api-current-state","z":"eff08008135be678","name":"Train sensor","server":"2ac5e9467e57d943","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.feanwalden_groningen","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"entity"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":650,"y":500,"wires":[["02400e41f2d4d860"]]},{"id":"02400e41f2d4d860","type":"function","z":"eff08008135be678","name":"JS","func":"var moment = global.get('moment');\nvar currentTime = msg.payload;\nvar targetTime = moment('07:19:00', 'HH:mm:ss');\n\nif (moment(currentTime, 'HH:mm:ss').isBefore(targetTime)) {\n    // Current time is before 7:25\n\n    if (msg.payload && msg.departure_time_planned) {\n        var departureTime = msg.departure_time_planned;\n\n        msg.payload.departure = departureTime;\n\n        var weatherTemperature = msg.buienradar_feel_temperature;\n\n        msg.payload.weatherTemperature = weatherTemperature;\n\n        msg.payload = \"The train is on time and leaves on: \" + msg.departure + \". The Outside temperature is \" + msg.weatherTemperature + \"°C\";\n        \n    } else {\n\n        node.error(\"Missing or invalid data in msg.payload\");\n    }\n}\n\nreturn msg.payload = \"The train is on time and leaves on: \" + msg.departure + \". The Outside temperature is \" + msg.weatherTemperature & \"°C\";","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"moment","module":"moment"}],"x":870,"y":320,"wires":[["29abe4afdf2e5645"]]},{"id":"29abe4afdf2e5645","type":"api-call-service","z":"eff08008135be678","name":"Notify mobile","server":"2ac5e9467e57d943","version":5,"debugenabled":false,"domain":"notify","service":"mobile_app_iphone_van_willem","areaId":[],"deviceId":[],"entityId":[],"data":"{\t    \"message\":  payload}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1110,"y":240,"wires":[["797e77afcb16f5fe"]]},{"id":"797e77afcb16f5fe","type":"debug","z":"eff08008135be678","name":"debug 13","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1360,"y":320,"wires":[]},{"id":"2ac5e9467e57d943","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":": ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"default","statusTimeFormat":"h:m","enableGlobalContextStore":false}]
In je laatste node;
code:
1
2
3
{
    "message": "{{payload}}"
}

ipv
code:
1
{       "message":  payload}

Acties:
  • 0 Henk 'm!

  • CodeBaker
  • Registratie: November 2022
  • Laatst online: 17-09 15:54
@denuz wanneer ik de payload in een variable doe krijg ik helemaal geen notify. Wanneer ik de function node debug krijg ik alleen de trein tijd.

code function node:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var moment = global.get('moment');
var currentTime = msg.payload;
var targetTime = moment('18:25:00', 'HH:mm:ss');

if (moment(currentTime, 'HH:mm:ss').isBefore(targetTime)) {
   

    if (msg.payload && msg.payload.departure_time_planned) {
        var departureTime = msg.payload.departure_time_planned;
        var weatherTemperature = msg.payload.buienradar_feel_temperature;

           return msg = "The train is on time and leaves on: " + departureTime + ". The Outside temperature is " + weatherTemperature + "°C";
    }  
}

return msg;

Acties:
  • +1 Henk 'm!

  • musicpixel
  • Registratie: Juni 2011
  • Laatst online: 21-09 19:25
CodeBaker schreef op vrijdag 20 oktober 2023 @ 15:38:
@denuz wanneer ik de payload in een variable doe krijg ik helemaal geen notify. Wanneer ik de function node debug krijg ik alleen de trein tijd.

code function node:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var moment = global.get('moment');
var currentTime = msg.payload;
var targetTime = moment('18:25:00', 'HH:mm:ss');

if (moment(currentTime, 'HH:mm:ss').isBefore(targetTime)) {
   

    if (msg.payload && msg.payload.departure_time_planned) {
        var departureTime = msg.payload.departure_time_planned;
        var weatherTemperature = msg.payload.buienradar_feel_temperature;

           return msg = "The train is on time and leaves on: " + departureTime + ". The Outside temperature is " + weatherTemperature + "°C";
    }  
}

return msg;
Ik zie in je bovenstaande code al iets vreemds:
- volgens regel 2 zou msg.payload de currentTime moeten bevatten.
- volgens regel 8,9,10 zit er departure_time_planned en buienradar_feel_temperature in

Ik denk dat dat niet goed gaat.

Verder ook de flow uit je eerdere post bekeken, en ook daar zie ik de nodige inconsistentie in variabelenamen. De JS uit je geposte flow is ook anders dan de JS uit de post hierboven.

Ik zou eerst eens de output van iedere node die data ophaalt te testen/controleren met een debug node.

In je flow zie ik ook twee lijntjes vanaf de inject node komen, wat ik wat eigenaardig vind, tenzij je twee notificaties wilt...

En als tip kan ik je nog meegeven dat het niet verplicht is om constant msg.payload te gebruiken, je kunt ook bijvoorbeeld een msg.feel_temperature maken (dus zonder het payload stukje) door deze in een change node te vullen met msg.payload die je van de buienradarsensor krijgt.

Heb je alle data bij elkaar dan kun je een template node gebruiken om je message te formatteren en door te geven aan de node die een notificatie stuurt.

Feel free to Buy me a coffee


Acties:
  • 0 Henk 'm!

  • bbbrumbrum
  • Registratie: November 2003
  • Niet online
Heren, sinds een jaartje nu ook met HA en NR bezig.
Heb de meeste automations in HA zitten, maar een paar wat langere/complexere in NR.

Allemaal vrij straightforward, dus echte ervaring heb ik nog niet op kunnen doen.

Ik loop nu echter tegen een uitdaging aan waar ik met m'm huidige kennis niet uit kom helaas.

Deze automation gebruik ik voor de continu variabele aansturing van mijn WTW.
Deze word door een 0-10V module over KNX aangestuurd. Momenteel heb ik een vergelijkbare automation in "trappen" en alleen obv CO2.
Ik zou deze graag variabel maken (wat met de "range" node dus al wel lukt), en dat vervolgens de hoogste van (momenteel) 2 luchtkwaliteitswaarden de hoogte van aansturing bepaald.

Waar het nu op hangt is deze laatste stap, het vergelijken van de output van 2 nodes en de hoogste vervolgens doorzetten in de flow.

Had al wat verschillende alterenatieven gevonden om aan te sturen, maar daar kwam ik ook niet verder mee, deze staan nog onderin onderstaand.

Hoor graag hoe jullie dit "probleem' zouden aanvliegen... :)
code:
1
[{"id":"d67bc993874c694c","type":"tab","label":"WTW Control - range","disabled":false,"info":"","env":[]},{"id":"6bc2755e.9feb9c","type":"debug","z":"d67bc993874c694c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":770,"y":420,"wires":[]},{"id":"38bd03eb.f7d06c","type":"change","z":"d67bc993874c694c","name":"choose lower value","rules":[{"t":"set","p":"payload","pt":"msg","to":"$min([$flowContext(\"temp1\"), $flowContext(\"temp2\")])\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":570,"y":420,"wires":[["6bc2755e.9feb9c"]]},{"id":"9066677f.eb0358","type":"change","z":"d67bc993874c694c","name":"store temp1","rules":[{"t":"set","p":"temp1","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":330,"y":400,"wires":[["38bd03eb.f7d06c"]]},{"id":"a70c9b2a.e7db58","type":"change","z":"d67bc993874c694c","name":"store temp2","rules":[{"t":"set","p":"temp2","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":330,"y":440,"wires":[["38bd03eb.f7d06c"]]},{"id":"4bd27616.d022c8","type":"inject","z":"d67bc993874c694c","name":"temp source 2","repeat":"","crontab":"","once":false,"onceDelay":"1.5","topic":"","payload":"12","payloadType":"num","x":150,"y":440,"wires":[["a70c9b2a.e7db58"]]},{"id":"7378dd4f.3825b4","type":"inject","z":"d67bc993874c694c","name":"temp source 1","repeat":"","crontab":"","once":false,"onceDelay":"1","topic":"","payload":"10","payloadType":"num","x":150,"y":400,"wires":[["9066677f.eb0358"]]},{"id":"314eb0ec.85211","type":"inject","z":"d67bc993874c694c","name":"","repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":360,"wires":[["688646b.138a6b8"]]},{"id":"688646b.138a6b8","type":"change","z":"d67bc993874c694c","name":"set to high","rules":[{"t":"set","p":"temp1","pt":"flow","to":"999","tot":"num"},{"t":"set","p":"temp2","pt":"flow","to":"999","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":330,"y":360,"wires":[[]]},{"id":"7bdc411ff1051a47","type":"server-state-changed","z":"d67bc993874c694c","name":"Co2 max sensor","server":"cd801c03.2d248","version":5,"outputs":1,"exposeAsEntityConfig":"","entityId":"sensor.co2_max","entityIdType":"exact","outputInitially":false,"stateType":"num","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":140,"y":120,"wires":[["7cca126d8df39fae"]]},{"id":"7b94e2a85216dbd1","type":"api-call-service","z":"d67bc993874c694c","name":"","server":"cd801c03.2d248","version":5,"debugenabled":true,"domain":"fan","service":"set_percentage","areaId":[],"deviceId":[],"entityId":["fan.wtw_zehnder"],"data":"{   \"percentage\": 15 }","dataType":"json","mergeContext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":1150,"y":140,"wires":[[]]},{"id":"26bfb4c3fab0b488","type":"server-state-changed","z":"d67bc993874c694c","name":"PM2.5 Indoor ","server":"cd801c03.2d248","version":5,"outputs":1,"exposeAsEntityConfig":"","entityId":"sensor.particulate_matter_2_5um_concentration","entityIdType":"exact","outputInitially":false,"stateType":"num","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":130,"y":180,"wires":[["c14c5b5290d20da6"]]},{"id":"7811cc5b00562817","type":"debug","z":"d67bc993874c694c","name":"debug 8","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":420,"y":40,"wires":[]},{"id":"7cca126d8df39fae","type":"range","z":"d67bc993874c694c","minin":"500","maxin":"1500","minout":"5","maxout":"100","action":"clamp","round":true,"property":"payload","name":"Convert 500-1500PPM to 5-100%","x":420,"y":120,"wires":[["7811cc5b00562817","5885adc8ddff97d1"]]},{"id":"c14c5b5290d20da6","type":"range","z":"d67bc993874c694c","minin":"0","maxin":"150","minout":"5","maxout":"100","action":"clamp","round":true,"property":"payload","name":"Convert 0-150PPM to 5-100%","x":430,"y":180,"wires":[["1608301c08808845","5885adc8ddff97d1"]]},{"id":"1608301c08808845","type":"debug","z":"d67bc993874c694c","name":"debug 9","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":420,"y":240,"wires":[]},{"id":"087653f3615d64d8","type":"calculator","z":"d67bc993874c694c","name":"","inputMsgField":"payload","outputMsgField":"payload","operation":"max","constant":"","round":false,"truncate":false,"decimals":0,"decimals2":0,"x":940,"y":140,"wires":[["14214049bc06a632","7b94e2a85216dbd1"]]},{"id":"f46b5183dc53f2cb","type":"debug","z":"d67bc993874c694c","name":"debug 10","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":720,"y":240,"wires":[]},{"id":"5885adc8ddff97d1","type":"join","z":"d67bc993874c694c","name":"","mode":"custom","build":"array","property":"","propertyType":"full","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":710,"y":140,"wires":[["087653f3615d64d8","f46b5183dc53f2cb"]]},{"id":"14214049bc06a632","type":"debug","z":"d67bc993874c694c","name":"debug 11","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":940,"y":240,"wires":[]},{"id":"155917d4b49ffe32","type":"calculator","z":"d67bc993874c694c","name":"","inputMsgField":"payload","outputMsgField":"payload","operation":"max","constant":"","round":false,"truncate":false,"decimals":0,"decimals2":"0","x":400,"y":520,"wires":[["87d566cb7ec7bba9"]]},{"id":"a03507fb03edaf37","type":"inject","z":"d67bc993874c694c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[321,123,333,222,111]","payloadType":"json","x":180,"y":520,"wires":[["155917d4b49ffe32"]]},{"id":"87d566cb7ec7bba9","type":"debug","z":"d67bc993874c694c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":590,"y":520,"wires":[]},{"id":"213567588842cc10","type":"inject","z":"d67bc993874c694c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"10","payloadType":"json","x":130,"y":600,"wires":[["66540a48440715f0"]]},{"id":"a63123437d70b3ba","type":"inject","z":"d67bc993874c694c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"11","payloadType":"json","x":130,"y":640,"wires":[["3a75b9863cc2fe11"]]},{"id":"97cbe000aad067bf","type":"join","z":"d67bc993874c694c","name":"","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"","joinerType":"str","accumulate":true,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":730,"y":620,"wires":[["812ba82b80af11e0"]]},{"id":"812ba82b80af11e0","type":"debug","z":"d67bc993874c694c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"true","targetType":"full","statusVal":"payload","statusType":"auto","x":890,"y":620,"wires":[]},{"id":"7451555a06517e2c","type":"change","z":"d67bc993874c694c","name":"set payload value","rules":[{"t":"set","p":"payload","pt":"msg","to":"req.params.value","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":530,"y":620,"wires":[["97cbe000aad067bf"]]},{"id":"3a75b9863cc2fe11","type":"change","z":"d67bc993874c694c","name":"set topic 2","rules":[{"t":"set","p":"topic","pt":"msg","to":"source2","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":310,"y":640,"wires":[["7451555a06517e2c"]]},{"id":"66540a48440715f0","type":"change","z":"d67bc993874c694c","name":"set topic 1","rules":[{"t":"set","p":"topic","pt":"msg","to":"source1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":310,"y":600,"wires":[["7451555a06517e2c"]]},{"id":"cd801c03.2d248","type":"server","name":"Home Assistant","addon":true}]


Afbeeldingslocatie: https://tweakers.net/i/ztoLkLvGGXEa038QffBvlQ9dYIc=/800x/filters:strip_icc():strip_exif()/f/image/IBX268zwJMHoOnSToOMhTmGs.jpg?f=fotoalbum_large

Acties:
  • 0 Henk 'm!

  • Gizz
  • Registratie: Maart 2001
  • Laatst online: 06:36

Gizz

Dunder-Mifflin, Inc.

@bbbrumbrum het kiezen van de hoogste waarde kun je uit mijn ventilatieflow lenen: Gizz in "Node-RED - grafisch 'programmeren' (bijv. voor domotica)"

edit: voor het gemak nog even het stukje waarom het gaat. Je pakt dus een change node met daarin een stukje code om de hoogste waarde (max) te selecteren. In mijn voorbeeld:

Afbeeldingslocatie: https://tweakers.net/i/Dx1e8SrqpLKIc_8vckub68Q1MWU=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/39DPz0rhSeHhl9KSqjJk4eDq.png?f=user_large
code:
1
$max([$flowContext("co21"), $flowContext("co22"), $flowContext("co23"),  $flowContext("fijnstof"), $flowContext("hum")])

[ Voor 58% gewijzigd door Gizz op 04-11-2023 12:04 ]

Canon EOS 5Dm3 + 5D + 7D + 300D + 1000FN + EF 17-40 4L + EF 35 1.4L + EF 50 1.8 + EF 80-200 2.8L + 550EX


Acties:
  • 0 Henk 'm!

  • bbbrumbrum
  • Registratie: November 2003
  • Niet online
Gizz schreef op zaterdag 4 november 2023 @ 09:26:
@bbbrumbrum het kiezen van de hoogste waarde kun je uit mijn ventilatieflow lenen: Gizz in "Node-RED - grafisch 'programmeren' (bijv. voor domotica)"

edit: voor het gemak nog even het stukje waarom het gaat. Je pakt dus een change node met daarin een stukje code om de hoogste waarde (max) te selecteren. In mijn voorbeeld:

[Afbeelding]
code:
1
$max([$flowContext("co21"), $flowContext("co22"), $flowContext("co23"),  $flowContext("fijnstof"), $flowContext("hum")])
Thanks!

Ben hiermee weer een stapje verder.

Zie flow:
code:
1
[{"id":"d67bc993874c694c","type":"tab","label":"WTW Control - range","disabled":false,"info":"","env":[]},{"id":"7bdc411ff1051a47","type":"server-state-changed","z":"d67bc993874c694c","name":"Co2 max sensor","server":"cd801c03.2d248","version":5,"outputs":1,"exposeAsEntityConfig":"","entityId":"sensor.co2_max","entityIdType":"exact","outputInitially":false,"stateType":"num","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":140,"y":120,"wires":[["7cca126d8df39fae"]]},{"id":"7b94e2a85216dbd1","type":"api-call-service","z":"d67bc993874c694c","name":"","server":"cd801c03.2d248","version":5,"debugenabled":true,"domain":"fan","service":"set_percentage","areaId":[],"deviceId":[],"entityId":["fan.wtw_zehnder"],"data":"{\"percentage\":{{co2}}}","dataType":"json","mergeContext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":1150,"y":140,"wires":[["14214049bc06a632"]]},{"id":"26bfb4c3fab0b488","type":"server-state-changed","z":"d67bc993874c694c","name":"PM2.5 Indoor ","server":"cd801c03.2d248","version":5,"outputs":1,"exposeAsEntityConfig":"","entityId":"sensor.particulate_matter_2_5um_concentration","entityIdType":"exact","outputInitially":false,"stateType":"num","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":130,"y":180,"wires":[["c14c5b5290d20da6"]]},{"id":"7811cc5b00562817","type":"debug","z":"d67bc993874c694c","name":"debug 8","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":420,"y":60,"wires":[]},{"id":"7cca126d8df39fae","type":"range","z":"d67bc993874c694c","minin":"500","maxin":"1500","minout":"5","maxout":"100","action":"clamp","round":true,"property":"payload","name":"Convert 500-1500PPM to 5-100%","x":420,"y":120,"wires":[["7811cc5b00562817","59a658dd5bec024f"]]},{"id":"c14c5b5290d20da6","type":"range","z":"d67bc993874c694c","minin":"0","maxin":"150","minout":"5","maxout":"100","action":"clamp","round":true,"property":"payload","name":"Convert 0-150PPM to 5-100%","x":430,"y":180,"wires":[["1608301c08808845","a4d854b6f5a77abc"]]},{"id":"1608301c08808845","type":"debug","z":"d67bc993874c694c","name":"debug 9","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":420,"y":240,"wires":[]},{"id":"f46b5183dc53f2cb","type":"debug","z":"d67bc993874c694c","name":"debug 10","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":880,"y":220,"wires":[]},{"id":"14214049bc06a632","type":"debug","z":"d67bc993874c694c","name":"debug 11","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1120,"y":220,"wires":[]},{"id":"59a658dd5bec024f","type":"change","z":"d67bc993874c694c","name":"store","rules":[{"t":"set","p":"co21","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":670,"y":120,"wires":[["01e096f39b58faa4"]]},{"id":"a4d854b6f5a77abc","type":"change","z":"d67bc993874c694c","name":"store","rules":[{"t":"set","p":"fijnstof","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":670,"y":180,"wires":[["01e096f39b58faa4"]]},{"id":"01e096f39b58faa4","type":"change","z":"d67bc993874c694c","name":"choose highest value","rules":[{"t":"set","p":"co2","pt":"msg","to":"$max([$flowContext(\"co21\"), $flowContext(\"fijnstof\")])\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":880,"y":140,"wires":[["f46b5183dc53f2cb","7b94e2a85216dbd1"]]},{"id":"cd801c03.2d248","type":"server","name":"Home Assistant","addon":true}]


2 issues open:
- Hoe gebruik ik de payload "CO2" als "percentage" voor mn service_call node?

- De PM waarde word veel vaker ververst dan de CO2 waarde, echter bij updaten van de PM waarde springt hij naar deze ipv dat hij op de hogere CO2 waarde blijft staan.

Acties:
  • 0 Henk 'm!

  • Gizz
  • Registratie: Maart 2001
  • Laatst online: 06:36

Gizz

Dunder-Mifflin, Inc.

bbbrumbrum schreef op zondag 5 november 2023 @ 01:25:
[...]
- De PM waarde word veel vaker ververst dan de CO2 waarde, echter bij updaten van de PM waarde springt hij naar deze ipv dat hij op de hogere CO2 waarde blijft staan.
Het is alweer een paar jaar geleden dat ik mijn flow heb gemaakt, maar volgens mij bewaar ik de waarde daarom eerst in een flow.co21, flow.co22 etc. Dan blijven alle laatste waardes netjes bewaard voor het kiezen van de hoogste waarde, ongeacht hoe vaak iets ververst wordt.

Canon EOS 5Dm3 + 5D + 7D + 300D + 1000FN + EF 17-40 4L + EF 35 1.4L + EF 50 1.8 + EF 80-200 2.8L + 550EX


Acties:
  • 0 Henk 'm!

  • bbbrumbrum
  • Registratie: November 2003
  • Niet online
Gizz schreef op zondag 5 november 2023 @ 11:01:
[...]

Het is alweer een paar jaar geleden dat ik mijn flow heb gemaakt, maar volgens mij bewaar ik de waarde daarom eerst in een flow.co21, flow.co22 etc. Dan blijven alle laatste waardes netjes bewaard voor het kiezen van de hoogste waarde, ongeacht hoe vaak iets ververst wordt.
Ben zelf nog even verder gaan frotten en het toevoegen van de change node met "set.msg.payload" na de change node die de hoogste waarde kiest, lijkt uiteindelijk de ontbrekende schakel te zijn geweest..

BIj deze nog de werkende flow:
code:
1
[{"id":"d67bc993874c694c","type":"tab","label":"WTW Control - range","disabled":false,"info":"","env":[]},{"id":"7bdc411ff1051a47","type":"server-state-changed","z":"d67bc993874c694c","name":"Co2 max sensor","server":"cd801c03.2d248","version":5,"outputs":1,"exposeAsEntityConfig":"","entityId":"sensor.co2_max","entityIdType":"exact","outputInitially":false,"stateType":"num","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":120,"y":120,"wires":[["7cca126d8df39fae"]]},{"id":"7b94e2a85216dbd1","type":"api-call-service","z":"d67bc993874c694c","name":"","server":"cd801c03.2d248","version":5,"debugenabled":true,"domain":"fan","service":"set_percentage","areaId":[],"deviceId":[],"entityId":["fan.wtw_zehnder"],"data":"{\"percentage\":{{co2}}}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1350,"y":140,"wires":[["5c36501bac6ef87b"]]},{"id":"26bfb4c3fab0b488","type":"server-state-changed","z":"d67bc993874c694c","name":"PM2.5 Indoor ","server":"cd801c03.2d248","version":5,"outputs":1,"exposeAsEntityConfig":"","entityId":"sensor.particulate_matter_2_5um_concentration","entityIdType":"exact","outputInitially":false,"stateType":"num","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":130,"y":180,"wires":[["c14c5b5290d20da6"]]},{"id":"7811cc5b00562817","type":"debug","z":"d67bc993874c694c","name":"debug 8","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":420,"y":60,"wires":[]},{"id":"7cca126d8df39fae","type":"range","z":"d67bc993874c694c","minin":"550","maxin":"1500","minout":"5","maxout":"100","action":"clamp","round":true,"property":"payload","name":"Convert 550-1500PPM to 5-100%","x":420,"y":120,"wires":[["7811cc5b00562817","59a658dd5bec024f"]]},{"id":"c14c5b5290d20da6","type":"range","z":"d67bc993874c694c","minin":"5","maxin":"150","minout":"5","maxout":"100","action":"clamp","round":true,"property":"payload","name":"Convert 5-150PPM to 5-100%","x":430,"y":180,"wires":[["1608301c08808845","a4d854b6f5a77abc"]]},{"id":"1608301c08808845","type":"debug","z":"d67bc993874c694c","name":"debug 9","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":420,"y":240,"wires":[]},{"id":"f46b5183dc53f2cb","type":"debug","z":"d67bc993874c694c","name":"debug 10","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":880,"y":220,"wires":[]},{"id":"14214049bc06a632","type":"debug","z":"d67bc993874c694c","name":"debug 11","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1120,"y":260,"wires":[]},{"id":"59a658dd5bec024f","type":"change","z":"d67bc993874c694c","name":"store","rules":[{"t":"set","p":"co21","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":670,"y":120,"wires":[["01e096f39b58faa4"]]},{"id":"a4d854b6f5a77abc","type":"change","z":"d67bc993874c694c","name":"store","rules":[{"t":"set","p":"fijnstof","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":670,"y":180,"wires":[["01e096f39b58faa4"]]},{"id":"01e096f39b58faa4","type":"change","z":"d67bc993874c694c","name":"choose highest value","rules":[{"t":"set","p":"co2","pt":"msg","to":"$max([$flowContext(\"co21\"), $flowContext(\"fijnstof\")])\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":880,"y":140,"wires":[["f46b5183dc53f2cb","19b256b737e7e780"]]},{"id":"19b256b737e7e780","type":"change","z":"d67bc993874c694c","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"co2","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1120,"y":140,"wires":[["7b94e2a85216dbd1","14214049bc06a632","888667f196e99808"]]},{"id":"5c36501bac6ef87b","type":"debug","z":"d67bc993874c694c","name":"debug 16","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1340,"y":260,"wires":[]},{"id":"888667f196e99808","type":"switch","z":"d67bc993874c694c","name":"","property":"payload","propertyType":"msg","rules":[{"t":"lt","v":"30","vt":"str"},{"t":"gt","v":"30","vt":"str"},{"t":"gt","v":"100","vt":"str"}],"checkall":"true","repair":false,"outputs":3,"x":430,"y":460,"wires":[["1e8acef07dc5fa12"],["f708ad9d5172c729"],["cd3ea967fe9da2c6"]]},{"id":"1e8acef07dc5fa12","type":"api-call-service","z":"d67bc993874c694c","name":"Green light - kitchen control","server":"cd801c03.2d248","version":5,"debugenabled":false,"domain":"input_boolean","service":"turn_on","areaId":[],"deviceId":[],"entityId":["input_boolean.1_6_8_kitchentopleft"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":740,"y":400,"wires":[["81de2fa8811d435d"]]},{"id":"cd3ea967fe9da2c6","type":"api-call-service","z":"d67bc993874c694c","name":"Red light - kitchen control","server":"cd801c03.2d248","version":5,"debugenabled":false,"domain":"input_boolean","service":"turn_on","areaId":[],"deviceId":[],"entityId":["input_boolean.1_6_10_kitchen_bottomleft"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":730,"y":520,"wires":[["6969aec256b02023"]]},{"id":"f708ad9d5172c729","type":"api-call-service","z":"d67bc993874c694c","name":"Yellow light - kitchen control","server":"cd801c03.2d248","version":5,"debugenabled":false,"domain":"input_boolean","service":"turn_on","areaId":[],"deviceId":[],"entityId":["input_boolean.1_6_9_kitchen_midleft"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":740,"y":460,"wires":[["4bf0ce905ebf37cc"]]},{"id":"4bf0ce905ebf37cc","type":"api-call-service","z":"d67bc993874c694c","name":"Turn OFF Red & Green","server":"cd801c03.2d248","version":5,"debugenabled":false,"domain":"input_boolean","service":"turn_off","areaId":[],"deviceId":[],"entityId":["input_boolean.1_6_10_kitchen_bottomleft","input_boolean.1_6_8_kitchentopleft"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1010,"y":460,"wires":[[]]},{"id":"81de2fa8811d435d","type":"api-call-service","z":"d67bc993874c694c","name":"Turn OFF Red & Yellow","server":"cd801c03.2d248","version":5,"debugenabled":false,"domain":"input_boolean","service":"turn_off","areaId":[],"deviceId":[],"entityId":["input_boolean.1_6_10_kitchen_bottomleft","input_boolean.1_6_9_kitchen_midleft"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1010,"y":400,"wires":[[]]},{"id":"6969aec256b02023","type":"api-call-service","z":"d67bc993874c694c","name":"Turn OFF Yellow & Green","server":"cd801c03.2d248","version":5,"debugenabled":false,"domain":"input_boolean","service":"turn_off","areaId":[],"deviceId":[],"entityId":["input_boolean.1_6_8_kitchentopleft","input_boolean.1_6_9_kitchen_midleft"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1010,"y":520,"wires":[[]]},{"id":"cd801c03.2d248","type":"server","name":"Home Assistant","addon":true}]


Bedankt voor je input iig!

Acties:
  • 0 Henk 'm!

  • Mawlana
  • Registratie: Juli 2002
  • Laatst online: 01:02
Ik heb verschillende 3 CO2-sensoren (badkamer, slaapkamer en woonkamer) en meerdere Aqara Temperature and Humidity sensoren. De waarden hiervan komen terecht in HA (via MQTT-integratie).

In NR lees ik elke minuut de waarden van al deze entities uit, hierdoor hoef ik niks op te slaan in NR. Hiervoor gebruik ik de "Get entities node". De payloads hiervan gaan naar een function node waarin ik enkele stats bereken en doorgeef naar de volgende function node om de gewenste airflow te berekenen: max/avg/std van alles, de slaapkamer, badkamer, woonkamer, alles behalve badkamer, alles behalve slaapkamer etc - zowel co2 als relatieve luchtvochtigheid. Hierdoor kan ik verder in mijn flow vrij eenvoudig wat uitzonderingen toevoegen (bijv. co2 mag 's nachts wel iets toenemen, mits de co2-waarde enkel in de slaapkamer verhoogd is). In die tweede function node bereken ik de gewenste airflow obv CO2 en luchtvochtigheid afzonderlijk, en daarvan neem ik het maximum.

Acties:
  • 0 Henk 'm!

  • bbbrumbrum
  • Registratie: November 2003
  • Niet online
Mawlana schreef op maandag 6 november 2023 @ 14:04:
Ik heb verschillende 3 CO2-sensoren (badkamer, slaapkamer en woonkamer) en meerdere Aqara Temperature and Humidity sensoren. De waarden hiervan komen terecht in HA (via MQTT-integratie).

In NR lees ik elke minuut de waarden van al deze entities uit, hierdoor hoef ik niks op te slaan in NR. Hiervoor gebruik ik de "Get entities node". De payloads hiervan gaan naar een function node waarin ik enkele stats bereken en doorgeef naar de volgende function node om de gewenste airflow te berekenen: max/avg/std van alles, de slaapkamer, badkamer, woonkamer, alles behalve badkamer, alles behalve slaapkamer etc - zowel co2 als relatieve luchtvochtigheid. Hierdoor kan ik verder in mijn flow vrij eenvoudig wat uitzonderingen toevoegen (bijv. co2 mag 's nachts wel iets toenemen, mits de co2-waarde enkel in de slaapkamer verhoogd is). In die tweede function node bereken ik de gewenste airflow obv CO2 en luchtvochtigheid afzonderlijk, en daarvan neem ik het maximum.
Heb ik het net werkend.... Zou je die flow willen delen? Klinkt goed nl. :)

Acties:
  • 0 Henk 'm!

  • Mawlana
  • Registratie: Juli 2002
  • Laatst online: 01:02
bbbrumbrum schreef op maandag 6 november 2023 @ 14:37:
[...]

Heb ik het net werkend.... Zou je die flow willen delen? Klinkt goed nl. :)
Zie code hieronder voor een deel van de flow - de rest is iets te rommelig en heeft meer te maken met automatiseringen (vraaggestuurde ventilatie uit, boost aan etc). De driestandenschakelaar staat bij mij thuis altijd op 2 (Medium) - ik verander de instelling van deze stand voor vraaggestuurde ventilatie. Voor maximaal ventileren zet ik de wtw op stand 3 via ebus.

In de tweede function node (calculate airflow) moet je even spelen met de thresholds (airflow moet in mijn geval tussen 110 en 295 m³/h blijven). Om te voorkomen dat de wtw 24/7 maximaal staat te blazen heb ik zoals je ziet in de code ook een wegingsfactor toegevoegd.


Afbeeldingslocatie: https://tweakers.net/i/8klm0MbI_iUoAFHJ2EqagkNoLrc=/800x/filters:strip_icc():strip_exif()/f/image/23XJrD6VSqo5qy6QO1QCGvTp.jpg?f=fotoalbum_large
code:
1
[{"id":"1d3b2904c9ea310f","type":"tab","label":"Flow 2","disabled":false,"info":"","env":[]},{"id":"8f2431ca329421f7","type":"inject","z":"1d3b2904c9ea310f","name":"1 minute","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"60","crontab":"","once":true,"onceDelay":"1","topic":"demand_control","payloadType":"date","x":300,"y":320,"wires":[["432da8320bff2d17"]]},{"id":"432da8320bff2d17","type":"ha-get-entities","z":"1d3b2904c9ea310f","name":"Get CO2 & Humidity","server":"1954c1b0553f0256","version":0,"rules":[{"property":"entity_id","logic":"is","value":"co2_value|thp_humidity","valueType":"re"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"payload","output_results_count":1,"x":520,"y":320,"wires":[["70c3881e19a23eea"]]},{"id":"70c3881e19a23eea","type":"function","z":"1d3b2904c9ea310f","name":"calc stats","func":"function parseEntities(payload) {\n    const values = { \"co2\": [], \"humidity\": [] };\n    let sensor_type = null;\n    for (const [_, sensor] of Object.entries(payload)) {\n        if (sensor.entity_id.includes(\"co2_value\")) {\n            sensor_type = \"co2\";\n        } else if (sensor.entity_id.includes(\"thp_humidity\")) {\n            sensor_type = \"humidity\";\n        } else {\n            sensor_type = null;\n        }\n        if(\"state\" in sensor && sensor_type !== null) {\n            let sensorValue = parseInt(sensor.state);\n            values[sensor_type].push([sensor.entity_id, sensorValue]);\n        }\n    }\n    return values;\n}\n\nfunction ArrAverage(arr) {\n    const arrSum = arr => arr.reduce((a,b) => a + b, 0)\n    return Math.round(arrSum(arr) / arr.length,0);\n}\n\nfunction StandardDeviation(arr) {\n \n    // Creating the mean with Array.reduce\n    let mean = arr.reduce((acc, curr) => {\n        return acc + curr\n    }, 0) / arr.length;\n \n    // Assigning (value - mean) ^ 2 to\n    // every array item\n    arr = arr.map((k) => {\n        return (k - mean) ** 2\n    });\n \n    // Calculating the sum of updated array \n    let sum = arr.reduce((acc, curr) => acc + curr, 0);\n \n    // Calculating the variance\n    let variance = sum / arr.length\n \n    // Returning the standard deviation\n    return Math.round(Math.sqrt(sum / arr.length),1)\n}\n\nfunction filterValues(data, entity=null, inverse=false) {\n    const values = [];\n    for(const [_, sensor] of Object.entries(data)) {\n        const [entity_id, value] = sensor;\n        if((entity === null) || (!inverse && !entity_id.includes(entity)) || (inverse && entity_id.includes(entity))) {\n            values.push(value);\n        }\n    }\n    if(values.length == 0) {\n        return null;\n    }\n    return {\"avg\": ArrAverage(values), \"std\": StandardDeviation(values), \"max\": Math.max(...values), \"list\": values, \"items_original\": data.length, \"items_included\": values.length};\n}\n//----------------------------------------------------------------------------------\nmsg.data = msg.payload;\nmsg.payload = {};\nconst data = parseEntities(msg.data);\nconst sensor_types = [\"co2\", \"humidity\"];\nconst filters = {\n        \"overall\": [null, false], \n        \"bedroom\": [\"slaapkamer\", true], \n        \"bathroom\": [\"badkamer\", true], \n        \"living\": [\"woonkamer\", true],\n        \"attic\": [\"zolder\", true],\n        \"excl_bedroom\": [\"slaapkamer\", false], \n        \"excl_bathroom\": [\"badkamer\", false],\n        \"excl_living\": [\"woonkamer\", false],\n        \"excl_attic\": [\"zolder\", false]\n    };\nsensor_types.forEach((sensor_type) => {\n    if(msg.payload[sensor_type] === undefined) {\n        msg.payload[sensor_type] = {};\n    }\n    for(const [filter_name, filter_values] of Object.entries(filters)) {\n        msg.payload[sensor_type][filter_name] = filterValues(data[sensor_type], filter_values[0], filter_values[1]);\n    }\n\n});\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":700,"y":380,"wires":[["5973c88e7e4d0d03"]]},{"id":"5973c88e7e4d0d03","type":"function","z":"1d3b2904c9ea310f","name":"calculate airflow","func":"const data = msg.payload;\nconst hourOfDay = new Date().getHours();\n\nconst minAirflow = 110;\nconst maxAirflow = 295;\nconst rangeAirflow = maxAirflow-minAirflow;\n\nconst minCO2 = 500;\nconst maxCO2 = 1200;\nconst rangeCO2 = maxCO2-minCO2;\n\nconst minHumidity = 50;\nconst maxHumidity = 85;\nconst rangeHumidity = maxHumidity-minHumidity;\n\nlet targetAirflow = minAirflow;\nlet breachCO2 = 0;\nlet breachHumidity = 0;\nlet weightCO2 = 0.7;\nlet weightHumidity = 0.25;\n\n// functions\nconst round5 = (x) => Math.ceil(x/5)*5;\nconst calcAirflow = (x) => round5(minAirflow + x * rangeAirflow);\nconst betweenZeroAndOne = (x) => Math.min(Math.max(x,0),1)\n\nif(data.co2.overall.max >= minCO2) {\n    // CO2 breach\n    breachCO2 = data.co2.overall.max; // maximum CO2 level\n\tif(data.co2.overall.max == data.co2.bedroom.max) {\n\t    // during night\n\t    // && (hourOfDay >= 22 || hourOfDay <= 10)) {\n\t\t\n\t\t// high CO2 in bedroom\n\t\tweightCO2 *= .75;\n\t} \n\t// subtract minCO2 to calculate the actual breach, and multiply\n\t// with correctionCO2\n    breachCO2 = (breachCO2 - minCO2) * weightCO2;\n}\n\nif(data.humidity.overall.max >= minHumidity) {\n    // humidity breach\n    if(data.humidity.overall.max == data.humidity.bathroom.max && data.humidity.bathroom.max >= 70) {\n        // wet bathroom\n        \n        // extreme wet bathroom\n        if((data.humidity.bathroom.max-data.humidity.excl_bathroom.max) > 5) {\n            weightHumidity *= 3;\n        }\n        weightHumidity *= 2;\n    }\n    breachHumidity = (data.humidity.overall.max - minHumidity) * weightHumidity\n}\n\nlet breaches = [breachHumidity / rangeHumidity, breachCO2 / rangeCO2];\nbreaches = breaches.map(betweenZeroAndOne)\ntargetAirflow = {\t\"CO2\": calcAirflow(breaches[1]), \n\t\t\t\t\t\"Humidity\": calcAirflow(breaches[0]),\n\t\t\t\t\t\"Result\": calcAirflow(Math.max(...breaches))\n\t\t\t\t};\n\nmsg.data = data;\nmsg.airflow = targetAirflow;\nmsg.payload = targetAirflow[\"Result\"];\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":880,"y":320,"wires":[["57b3860a8af87dcd"]]},{"id":"57b3860a8af87dcd","type":"debug","z":"1d3b2904c9ea310f","name":"msg.airflow","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"airflow","targetType":"msg","statusVal":"","statusType":"auto","x":1110,"y":420,"wires":[]},{"id":"1954c1b0553f0256","type":"server","name":"Home Assistant","version":5,"addon":false,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]

Acties:
  • 0 Henk 'm!

  • bbbrumbrum
  • Registratie: November 2003
  • Niet online
Mawlana schreef op maandag 6 november 2023 @ 15:21:
[...]

Zie code hieronder voor een deel van de flow - de rest is iets te rommelig en heeft meer te maken met automatiseringen (vraaggestuurde ventilatie uit, boost aan etc). De driestandenschakelaar staat bij mij thuis altijd op 2 (Medium) - ik verander de instelling van deze stand voor vraaggestuurde ventilatie. Voor maximaal ventileren zet ik de wtw op stand 3 via ebus.

In de tweede function node (calculate airflow) moet je even spelen met de thresholds (airflow moet in mijn geval tussen 110 en 295 m³/h blijven). Om te voorkomen dat de wtw 24/7 maximaal staat te blazen heb ik zoals je ziet in de code ook een wegingsfactor toegevoegd.


[Afbeelding]
code:
1
[{"id":"1d3b2904c9ea310f","type":"tab","label":"Flow 2","disabled":false,"info":"","env":[]},{"id":"8f2431ca329421f7","type":"inject","z":"1d3b2904c9ea310f","name":"1 minute","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"60","crontab":"","once":true,"onceDelay":"1","topic":"demand_control","payloadType":"date","x":300,"y":320,"wires":[["432da8320bff2d17"]]},{"id":"432da8320bff2d17","type":"ha-get-entities","z":"1d3b2904c9ea310f","name":"Get CO2 & Humidity","server":"1954c1b0553f0256","version":0,"rules":[{"property":"entity_id","logic":"is","value":"co2_value|thp_humidity","valueType":"re"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"payload","output_results_count":1,"x":520,"y":320,"wires":[["70c3881e19a23eea"]]},{"id":"70c3881e19a23eea","type":"function","z":"1d3b2904c9ea310f","name":"calc stats","func":"function parseEntities(payload) {\n    const values = { \"co2\": [], \"humidity\": [] };\n    let sensor_type = null;\n    for (const [_, sensor] of Object.entries(payload)) {\n        if (sensor.entity_id.includes(\"co2_value\")) {\n            sensor_type = \"co2\";\n        } else if (sensor.entity_id.includes(\"thp_humidity\")) {\n            sensor_type = \"humidity\";\n        } else {\n            sensor_type = null;\n        }\n        if(\"state\" in sensor && sensor_type !== null) {\n            let sensorValue = parseInt(sensor.state);\n            values[sensor_type].push([sensor.entity_id, sensorValue]);\n        }\n    }\n    return values;\n}\n\nfunction ArrAverage(arr) {\n    const arrSum = arr => arr.reduce((a,b) => a + b, 0)\n    return Math.round(arrSum(arr) / arr.length,0);\n}\n\nfunction StandardDeviation(arr) {\n \n    // Creating the mean with Array.reduce\n    let mean = arr.reduce((acc, curr) => {\n        return acc + curr\n    }, 0) / arr.length;\n \n    // Assigning (value - mean) ^ 2 to\n    // every array item\n    arr = arr.map((k) => {\n        return (k - mean) ** 2\n    });\n \n    // Calculating the sum of updated array \n    let sum = arr.reduce((acc, curr) => acc + curr, 0);\n \n    // Calculating the variance\n    let variance = sum / arr.length\n \n    // Returning the standard deviation\n    return Math.round(Math.sqrt(sum / arr.length),1)\n}\n\nfunction filterValues(data, entity=null, inverse=false) {\n    const values = [];\n    for(const [_, sensor] of Object.entries(data)) {\n        const [entity_id, value] = sensor;\n        if((entity === null) || (!inverse && !entity_id.includes(entity)) || (inverse && entity_id.includes(entity))) {\n            values.push(value);\n        }\n    }\n    if(values.length == 0) {\n        return null;\n    }\n    return {\"avg\": ArrAverage(values), \"std\": StandardDeviation(values), \"max\": Math.max(...values), \"list\": values, \"items_original\": data.length, \"items_included\": values.length};\n}\n//----------------------------------------------------------------------------------\nmsg.data = msg.payload;\nmsg.payload = {};\nconst data = parseEntities(msg.data);\nconst sensor_types = [\"co2\", \"humidity\"];\nconst filters = {\n        \"overall\": [null, false], \n        \"bedroom\": [\"slaapkamer\", true], \n        \"bathroom\": [\"badkamer\", true], \n        \"living\": [\"woonkamer\", true],\n        \"attic\": [\"zolder\", true],\n        \"excl_bedroom\": [\"slaapkamer\", false], \n        \"excl_bathroom\": [\"badkamer\", false],\n        \"excl_living\": [\"woonkamer\", false],\n        \"excl_attic\": [\"zolder\", false]\n    };\nsensor_types.forEach((sensor_type) => {\n    if(msg.payload[sensor_type] === undefined) {\n        msg.payload[sensor_type] = {};\n    }\n    for(const [filter_name, filter_values] of Object.entries(filters)) {\n        msg.payload[sensor_type][filter_name] = filterValues(data[sensor_type], filter_values[0], filter_values[1]);\n    }\n\n});\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":700,"y":380,"wires":[["5973c88e7e4d0d03"]]},{"id":"5973c88e7e4d0d03","type":"function","z":"1d3b2904c9ea310f","name":"calculate airflow","func":"const data = msg.payload;\nconst hourOfDay = new Date().getHours();\n\nconst minAirflow = 110;\nconst maxAirflow = 295;\nconst rangeAirflow = maxAirflow-minAirflow;\n\nconst minCO2 = 500;\nconst maxCO2 = 1200;\nconst rangeCO2 = maxCO2-minCO2;\n\nconst minHumidity = 50;\nconst maxHumidity = 85;\nconst rangeHumidity = maxHumidity-minHumidity;\n\nlet targetAirflow = minAirflow;\nlet breachCO2 = 0;\nlet breachHumidity = 0;\nlet weightCO2 = 0.7;\nlet weightHumidity = 0.25;\n\n// functions\nconst round5 = (x) => Math.ceil(x/5)*5;\nconst calcAirflow = (x) => round5(minAirflow + x * rangeAirflow);\nconst betweenZeroAndOne = (x) => Math.min(Math.max(x,0),1)\n\nif(data.co2.overall.max >= minCO2) {\n    // CO2 breach\n    breachCO2 = data.co2.overall.max; // maximum CO2 level\n\tif(data.co2.overall.max == data.co2.bedroom.max) {\n\t    // during night\n\t    // && (hourOfDay >= 22 || hourOfDay <= 10)) {\n\t\t\n\t\t// high CO2 in bedroom\n\t\tweightCO2 *= .75;\n\t} \n\t// subtract minCO2 to calculate the actual breach, and multiply\n\t// with correctionCO2\n    breachCO2 = (breachCO2 - minCO2) * weightCO2;\n}\n\nif(data.humidity.overall.max >= minHumidity) {\n    // humidity breach\n    if(data.humidity.overall.max == data.humidity.bathroom.max && data.humidity.bathroom.max >= 70) {\n        // wet bathroom\n        \n        // extreme wet bathroom\n        if((data.humidity.bathroom.max-data.humidity.excl_bathroom.max) > 5) {\n            weightHumidity *= 3;\n        }\n        weightHumidity *= 2;\n    }\n    breachHumidity = (data.humidity.overall.max - minHumidity) * weightHumidity\n}\n\nlet breaches = [breachHumidity / rangeHumidity, breachCO2 / rangeCO2];\nbreaches = breaches.map(betweenZeroAndOne)\ntargetAirflow = {\t\"CO2\": calcAirflow(breaches[1]), \n\t\t\t\t\t\"Humidity\": calcAirflow(breaches[0]),\n\t\t\t\t\t\"Result\": calcAirflow(Math.max(...breaches))\n\t\t\t\t};\n\nmsg.data = data;\nmsg.airflow = targetAirflow;\nmsg.payload = targetAirflow[\"Result\"];\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":880,"y":320,"wires":[["57b3860a8af87dcd"]]},{"id":"57b3860a8af87dcd","type":"debug","z":"1d3b2904c9ea310f","name":"msg.airflow","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"airflow","targetType":"msg","statusVal":"","statusType":"auto","x":1110,"y":420,"wires":[]},{"id":"1954c1b0553f0256","type":"server","name":"Home Assistant","version":5,"addon":false,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]
Respect! _/-\o_
Dit gaat me voorlopig boven de pet, al was het alleen al maar om de tijd die hierin gaat zitten. :z :z
Pagina: 1 ... 30 ... 32 Laatste