Přečtení hodnot z MQTT topicu a vygenerování nového MQTT topicu

Automatizace tvořené přímo, pomocí funkcí HomeAssitent(a).
Odpovědět
jiri.benes
Nováček na fóru
Nováček na fóru
Příspěvky: 2
Registrován: 24. srpen 2022, 22:25
Dostal poděkování: 1 poděkování

Přečtení hodnot z MQTT topicu a vygenerování nového MQTT topicu

Příspěvek od jiri.benes »

Ahoj všem,

jsem tu nový a trochu tápu s jednou automatizací. Je to pro mě docela oříšek. Pokud by někdo věděl jak na to, nebo alespoň nasměroval budu rád.

Popis problému:
Mám MQTT-DMX bránu + dva DMX stmívače a několik 24V CCT bodovek rozdělených na 4 pomyslné okruhy (resp. 8 reálných protože každá z bodovek má samostatný okruh pro teplou a studenou bílou). Zapojení a odkazy na reálné produkty jsou níže.

DMX brána poslouchá na MQTT topicu "DMX1" až "DMX8" a podle toho stmívají stmívače příslušný okruh.
Brána zpracovává hodnotu INTEGER od 0-255 (0=vypnuto; 255=maximum; cokoliv mezi je požadovaná úroveň setmění).
Vše je velmi prosté a funguje bezvadně, pokud máme na každém okruhu samostatné jednokanálové svítidlo. Problém nastává pokud potřebujeme míchat dva okruhy resp. MQTT topicy (potřebujeme míchat správnou barvu, ale i intezitu) na základě entity v homeassistantu.

MQTT templaty jsem vzdal a dobral jsem se k tomu, že bude lepší vytvořit novou entitu dle standardu HA, která bude do MQTT brookera publishovat příkaz pro stav svítidla. Následně vytvořit automatizaci které přečte tento stav a vytvoří dva nové MQTT topicy pro příslušné kanály které umí číst brána. Vytvořil jsem tedy následující entitu v HA:

Kód: Vybrat vše

mqtt:
  light:
    - schema: json
      name: "test postel svetlo"
      command_topic: "obyvak/svetlo/postel"   # MQTT topic na kterém HA vysílá
      brightness: true                        # povolí jas
      color_mode: true                        # povolí barevný mód
      supported_color_modes: ["color_temp"]   # přidá entitě možnost volby teploty bílé
      brightness_scale: 100                   # násobič hodnot pro DMX kanály pro případné ztlumení v %
      max_mireds: 500                         # odpovídá teplotě bílé 2000K 
      min_mireds: 167                         # odpovídá teplotě bílé 6000K
No a teď jsem se zasekl u automatizace. Je mi jasné že musím z MQTT topicu publishovaným entitou viz. kód výše přečíst hodnoty na základě kterých vypočtu dvě hodnoty pro okruhy DMX1(teplá bílá) a DMX2(studená bílá) a výstup by měl vypadat nějak takhle:

Kód: Vybrat vše

2000K               4000K               6000K           #hodnota v KELVINECH
 500                 333                 167            #hodnota v MIREDS
  |-------------------|-------------------|
 255                 127                  0             #výstup okruh_DMX1 pro teplou bílou
  0                  127                 255            #výstup okruh_DMX2 pro studenou bílou

Hodnoty 0-255 pro okruhy DMX1 a DMX2 je nutné ještě vynásobit násobičem jasu 0-100%, 
abychom docíli případného utlumení při stejné barvě světla.
Pro vypnutí budou obě hodnoty pro oba kanály 0.
Narazil jsem ale na několik problémů:
  • publikovaný topic z HA obsahuje jen danou změnu např. state ON na OFF a nebo jen hodnotu color_temp v MIREDS, ale nepošle celej JSON (tj. state, color_temp a brightness hodnoty) - to nám automatizaci dost komplikuje
  • hodnoty je zapotřebí zaokrouhlovat
  • nevím jestli na vše nejdu zbytečně složitě
Zapojení

Kód: Vybrat vše

HomeAssistant
└── MQTT-DMX brána
    ├── DMX1
    │   ├── okruh_DMX1
    │   ├── okruh_DMX2
    │   ├── okruh_DMX3
    │   └── okruh_DMX4
    └── DMX2
        ├── okruh_DMX5
        ├── okruh_DMX6
        ├── okruh_DMX7
        └── okruh_DMX8
Odkazy
DMX brána: https://www.adfweb.com/Home/products/DM ... pg=nav28_6
Stmívače: https://www.t-led.cz/p/dmx-dimled-dekod ... mcQAvD_BwE
Minalox bodovky: https://minalox.sk/collections/bodove-s ... 2000-6000k

Co je to DMX: https://www.lxf.cz/dmx/

Jak jsem psal výše, za jakoukoliv radu, nebo nasměrování budu rád.

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Přečtení hodnot z MQTT topicu a vygenerování nového MQTT topicu

Příspěvek od kiklhorn »

Ahoj,

zkusím jen nadhodit cestu kterou bych asi šel:

Home Assistant + Node-Red Add-on

https://www.youtube.com/watch?v=wBUAUdLkYJM

https://cookbook.nodered.org/#mqtt
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

jiri.benes
Nováček na fóru
Nováček na fóru
Příspěvky: 2
Registrován: 24. srpen 2022, 22:25
Dostal poděkování: 1 poděkování

Re: Přečtení hodnot z MQTT topicu a vygenerování nového MQTT topicu

Příspěvek od jiri.benes »

Děkuji za nasměrování. Nakonec jsem to vyřešil takto:

entita v HA:

Kód: Vybrat vše

mqtt:
  light:
    - schema: json
      name: "test postel svetlo"
      command_topic: "obyvak/svetlo/postel"   # MQTT topic na kterém HA vysílá
      brightness: true                        # povolí jas
      color_mode: true                        # povolí barevný mód
      supported_color_modes: ["color_temp"]   # přidá entitě možnost volby teploty bílé
      brightness_scale: 100                   # násobič hodnot pro DMX kanály pro případné ztlumení v %
      max_mireds: 500                         # odpovídá teplotě bílé 2000K 
      min_mireds: 167                         # odpovídá teplotě bílé 6000K
automatizace v NODE-RED (pro import):

Kód: Vybrat vše

[{"id":"d76f9aabdcd03f27","type":"trigger-state","z":"849f0c8f5471f69e","name":"","server":"bc6ab647.acbfd8","version":2,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityid":"light.test_postel_svetlo","entityidfiltertype":"exact","debugenabled":false,"constraints":[],"inputs":0,"outputs":4,"customoutputs":[{"messageType":"default","messageValue":"","messageValueType":"json","comparatorPropertyType":"current_state","comparatorPropertyValue":"new_state.state","comparatorType":"is","comparatorValue":"on","comparatorValueDataType":"str"},{"messageType":"default","messageValue":"","messageValueType":"json","comparatorPropertyType":"current_state","comparatorPropertyValue":"new_state.state","comparatorType":"is","comparatorValue":"off","comparatorValueDataType":"str"}],"outputinitially":false,"state_type":"str","enableInput":false,"x":160,"y":80,"wires":[[],[],["0d83b567ca78e922"],["9d7bec26b7cfb5b7","c89786e4885c24a2"]]},{"id":"9d7bec26b7cfb5b7","type":"api-call-service","z":"849f0c8f5471f69e","name":"","server":"bc6ab647.acbfd8","version":5,"debugenabled":false,"domain":"mqtt","service":"publish","areaId":[],"deviceId":[],"entityId":[],"data":"{\"topic\":\"DMX1\",\"payload\":\"0\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":170,"y":200,"wires":[[]]},{"id":"c89786e4885c24a2","type":"api-call-service","z":"849f0c8f5471f69e","name":"","server":"bc6ab647.acbfd8","version":5,"debugenabled":false,"domain":"mqtt","service":"publish","areaId":[],"deviceId":[],"entityId":[],"data":"{\"topic\":\"DMX2\",\"payload\":\"0\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":170,"y":260,"wires":[[]]},{"id":"0d83b567ca78e922","type":"api-current-state","z":"849f0c8f5471f69e","name":"","server":"bc6ab647.acbfd8","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.test_postel_svetlo","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":510,"y":80,"wires":[["b59048e766e103e0","07c89c563faa5071"]]},{"id":"07c89c563faa5071","type":"function","z":"849f0c8f5471f69e","name":"function 1","func":"msg.payload = Math.floor((((msg.data.attributes.color_temp - 167) / (500 - 167)) * 255 + 0) * (msg.data.attributes.brightness / 255))\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":780,"y":60,"wires":[["968a3fde54ac0dd2"]]},{"id":"968a3fde54ac0dd2","type":"api-call-service","z":"849f0c8f5471f69e","name":"","server":"bc6ab647.acbfd8","version":5,"debugenabled":false,"domain":"mqtt","service":"publish","areaId":[],"deviceId":[],"entityId":[],"data":"{\"topic\": \"DMX1\",\"payload\": {{payload}} }","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":970,"y":60,"wires":[[]]},{"id":"b59048e766e103e0","type":"function","z":"849f0c8f5471f69e","name":"function 2","func":"msg.payload = Math.floor((((msg.data.attributes.color_temp - 167) / (500 - 167)) * -255 + 255) * (msg.data.attributes.brightness / 255))\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":780,"y":120,"wires":[["2eae4efb8b8be4e2"]]},{"id":"2eae4efb8b8be4e2","type":"api-call-service","z":"849f0c8f5471f69e","name":"","server":"bc6ab647.acbfd8","version":5,"debugenabled":false,"domain":"mqtt","service":"publish","areaId":[],"deviceId":[],"entityId":[],"data":"{\"topic\": \"DMX2\",\"payload\": {{payload}} }","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":970,"y":120,"wires":[[]]},{"id":"57d6e94743cb821e","type":"comment","z":"849f0c8f5471f69e","name":"off","info":"","x":150,"y":160,"wires":[]},{"id":"0406b07fc206bfb4","type":"comment","z":"849f0c8f5471f69e","name":"on","info":"","x":410,"y":40,"wires":[]},{"id":"bc6ab647.acbfd8","type":"server","name":"Home Assistant","version":4,"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"}]
Na místě jsem to zatím nevyzkoušel, ale podle výstupů do MQTT brookera vypadá, že to dělá přesně co potřebuji.

Odpovědět

Zpět na „Automatizace“