Ta strona wygląda najlepiej z włączoną obsługą JavaScript

Implementacja wyświetlania prognozy pogody w Home Assistant na Ulanzi TC001

 ·  ☕ 5 min czytania  ·  🐧 sysadmin

Oto uporządkowany samouczek:

Część 1: Konfiguracja automatyzacji Home Assistant dla danych pogodowych

  1. Konfiguracja wyzwalacza: W Home Assistant utwórz automatyzację opartą na czasie, która będzie wykonywana co 10 minut.
  2. Konfiguracja działania: Użyj usługi mqtt.publish do wysyłania danych pogodowych. Sformatuj ładunek z niezbędnymi atrybutami pogodowymi (temperatura, stan, itp.).
1
2
3
4
5
6
{
  "text": "Temperature {{ state_attr('weather.home', 'temperature') }}°C, Humidity {{ state_attr('weather.home', 'humidity') }}%, Wind {{ state_attr('weather.home', 'wind_speed') }}km/h, Pressure {{ state_attr('weather.home', 'pressure') }}hPa",
  "icon": "53288",
  "rainbow": false,
  "duration": 30
}
  1. Temat MQTT: Zdefiniuj unikalny temat MQTT dla tej automatyzacji.
  • wzór: prefix/custom/name_of_the_panel

Część 2: Tworzenie schematu Node-RED dla wyświetlacza Ulanzi TC001

  1. Węzeł wyzwalacza: Użyj węzła Injektora ustawionego na wyzwalanie co 10 minut.
  2. Dane pogodowe: Użyj węzła “api-current-state” do pobrania najnowszego stanu pogody z weather.home.
  3. Formatowanie danych: Dodaj węzeł Funkcji, w którym konwertujesz stany pogodowe na komunikaty, używając obiektu mapującego (iconMap) dla warunków pogodowych na identyfikatory ikon specyficzne dla Ulanzi TC001.
  4. Komunikacja MQTT: Dodaj węzeł “MQTT out” skonfigurowany z danymi twojego brokera, ustawiony na publikowanie sformatowanej wiadomości do Ulanzi TC001.

Ten proces obejmuje pobieranie aktualizacji pogodowych z Home Assistant, formatowanie ich odpowiednio w Node-RED, a następnie wysyłanie sformatowanych danych na wyświetlacz Ulanzi TC001 za pośrednictwem MQTT. Pamiętaj, aby dostosować mapowanie między stanami pogody a identyfikatorami ikon zgodnie z wymaganiami twojego wyświetlacza i dostępnymi ikonami.

Oto schemat w formacie JSON, który możesz zaimportować do Node-RED. Pamiętaj, aby zmienić adres IP i temat wszędzie zgodnie z wyjaśnieniami w filmie.

  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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
[
    {
        "id": "c29e36f478fc3db8",
        "type": "tab",
        "label": "Weather Display",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "a372fa45308d730e",
        "type": "group",
        "z": "c29e36f478fc3db8",
        "style": {
            "stroke": "#3d3e46",
            "stroke-opacity": "1",
            "fill": "#21222c",
            "fill-opacity": "0.5",
            "label": true,
            "label-position": "nw",
            "color": "#f8f8f2"
        },
        "nodes": [
            "490bf156ccdcccfb",
            "89a06b94a01ea8ca",
            "21c94aafe496d28b",
            "156691c5396806f2"
        ],
        "x": 14,
        "y": 19,
        "w": 1072,
        "h": 82
    },
    {
        "id": "490bf156ccdcccfb",
        "type": "inject",
        "z": "c29e36f478fc3db8",
        "g": "a372fa45308d730e",
        "name": "Send Weather Periodically",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "600",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 180,
        "y": 60,
        "wires": [
            [
                "89a06b94a01ea8ca"
            ]
        ]
    },
    {
        "id": "89a06b94a01ea8ca",
        "type": "api-current-state",
        "z": "c29e36f478fc3db8",
        "g": "a372fa45308d730e",
        "name": "Get Weather State",
        "server": "073a5b0aaf38a13c",
        "version": 3,
        "outputs": 1,
        "halt_if": "",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "entity_id": "weather.home",
        "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": 430,
        "y": 60,
        "wires": [
            [
                "21c94aafe496d28b"
            ]
        ]
    },
    {
        "id": "801b22e036cb3913",
        "type": "function",
        "z": "563f3f5c2595232d",
        "g": "167b4fee447b386d",
        "name": "Format Weather Message",
        "func": "var state = msg.data.state;\nvar iconMap={\n    \"sunny\": \"11201\",\n    \"partlycloudy\": \"22586\",\n    \"cloudy\": \"2283\",\n    \"rainy\": \"53288\",\n    \"snowy\": \"4702\",\n    \"fog\": \"56703\"\n};\nvar iconId = iconMap[state.toLowerCase()] || \"16754\"\n\nvar temperature = msg.data.attributes.temperature;\nvar humidity = msg.data.attributes.humidity;\nvar windSpeed = msg.data.attributes.wind_speed;\nvar pressure = msg.data.attributes.pressure;\n\nmsg.payload = {\n    \"text\": `Temp: ${temperature}°C, Hum: ${humidity}%, Wind: ${windSpeed} km/h, Pressure: ${pressure} hPa`,\n    \"icon\": `${iconId}`, // Change based on your icon system\n    \"duration\": 30\n};\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 670,
        "y": 60,
        "wires": [
            [
                "74740f68df8feb6a"
            ]
        ]
    },
    {
        "id": "156691c5396806f2",
        "type": "mqtt out",
        "z": "c29e36f478fc3db8",
        "g": "a372fa45308d730e",
        "name": "Publish Weather to MQTT",
        "topic": "awtrix_prefix/custom/weather",
        "qos": "2",
        "retain": "false",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "346df2a95aac5785",
        "x": 950,
        "y": 60,
        "wires": []
    },
    {
        "id": "073a5b0aaf38a13c",
        "type": "server",
        "name": "Home Assistant",
        "version": 5,
        "addon": false,
        "rejectUnauthorizedCerts": false,
        "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
    },
    {
        "id": "346df2a95aac5785",
        "type": "mqtt-broker",
        "name": "MQTT HA Broker",
        "broker": "192.168.0.1",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "autoUnsubscribe": true,
        "birthTopic": "awtrix_prefix",
        "birthQos": "2",
        "birthRetain": "true",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "awtrix_prefix",
        "closeQos": "2",
        "closeRetain": "true",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "awtrix_prefix",
        "willQos": "2",
        "willRetain": "true",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    }
]

Ten schemat Node-RED jest zaprojektowany do pobierania bieżącego stanu pogody z Home Assistant, a dokładnie z jednostki weather.home. Przetwarza takie atrybuty jak temperatura, wilgotność, prędkość wiatru i ciśnienie, mapując je na strukturyzowane dane wyjściowe. Ponadto, schemat przekłada warunki pogodowe na specyficzne kody ikon na podstawie wcześniej zdefiniowanych mapowań, przygotowując dane wyjściowe do wyświetlenia na urządzeniu Ulanzi TC001 za pośrednictwem MQTT. To podejście zapewnia, że aktualizacje pogody w czasie rzeczywistym są wizualnie reprezentowane na urządzeniu Ulanzi. Jeśli masz jakiekolwiek konkretne pytania lub potrzebujesz dalszych dostosowań, daj mi znać!

Podziel się
Wesprzyj autora

sysadmin
UTWORZONE PRZEZ
sysadmin
QA & Linux Specialist