Zaczytanie JSON do encji

Cześć
Chcę odczytywać plik JSON i zapisywać wszystkie jego wartości do odpowiednich encji w HA.
Czy jest jakiś sposób żeby zrobić to automatycznie? Teoretycznie mógł bym utworzyć pomocników i zapisywać do nich odczytane wartości, jednak jest ich na tyle dużo że było by to czasochłonne i mało efektywne.
Zrobiłem taki zestaw jak na screenie


Przykładowe dane w formacie JSON

{"info":{"hst":"pvmterminal.local","myip":"192.168.0.82","pvsno":"014600DC","pvver":"1.12+","pvmmi":"56336" ,"pvme":"89340","pvrst":"4","pvstrt":"2022-05-29 17:04:36","pvrnt":"01d 06:29:26","s_bh1750" :"0","s_bmp180t":"0.00","s_bmp180p":"0"},"rs485":{"emetersread":[{"emtbl":"#emtbfw","em_#":"0" ,"em_Adres":"1","em_Nazwa":"Falownik Sofar","em_Czas stary":"21:26:06","em_Status":"100","em_Błędy":"511","em_Typ" :"Falownik Sofar KTL-X","em_StatusFW":"0002","em_P out":"0","em_P DC1":"0","em_P DC2":"0","em_En out":"14810.0" ,"em_En day out":"7,60","em_V DC1":"51.6","em_V DC2":"197,6","em_I DC1":"0.00","em_I DC2":"0.02","em_En DC1 ":"0.0","em_En day DC1":"0.00","em_En DC2":"0.0","em_En day DC2":"0.00","em_V L1":"241.8","em_V L2":" 240.3","em_V L3":"240.4","em_I L1":"0,95","em_I L2":"0,99","em_I L3":"0,99","em_Tm [h]":"7770", "em_TmD [min]":"1007","em_Temp":"31","em_Temp in":"48"}]},"pulse":{"empulseread":[{"em_#":"0", "em_Nazwa":"Dom","em_Czas stary":"17:04:59","em_Impulsy":"13003508","em_P":"0","em_kWh":"13003.508"},{"em_# ":"2","em_Nazwa":"1 Piętro","em_Czas Stary":"17:04:59","em_Impulsy":"3430435","em_P":"0","em_kWh":"3430.435 "},{"em_#":"3","em_Nazwa":"Pompa ciepła","em_Czas stary":"23:33:31","em_Impulsy":"17283843","em_P":"92" ,"em_kWh":"17283.843"}]},"sum":{"emsumread":[]},"18b20":{"ds18b20read":[{"s_ds18b20nr":"0","s_ds18b20a":"ec00000128d86928","s_ds18b20n": "DZ zimna","s_ds18b20i":"1","s_ds18b20p":"24","s_ds18b20c":"0.00","s_ds18b20v":"13.50","s_ds18b20t":"23:33:07"," s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":"1","s_ds18b20a":"6200000129931928","s_ds18b20n":"Temp piwnica","s_ds18b20i":"1", "s_ds18b20p":"65","s_ds18b20c":"0.00","s_ds18b20v":"22.50","s_ds18b20t":"23:33:09","s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":"2","s_ds18b20a":"100000012953d328","s_ds18b20n":"DZ ciepła","s_ds18b20i":"1" ,"s_ds18b20p":"23","s_ds18b20c":"0.00","s_ds18b20v":"13.00","s_ds18b20t":"23:33:11","s_ds18b20e":"OK","s_ds18b20ec":" 0"},{"s_ds18b20nr":"3","s_ds18b20a":"a03c01a816456c28","s_ds18b20n":"cyrkulacja cwu","s_ds18b20i":"1","s_ds18b20p":"62","s_ds18b20c": "0.00","s_ds18b20v":"32.81","s_ds18b20t":"23:33:12","s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":"4","s_ds18b20a":"73c01a816444828","s_ds18b20n":"Zewnętrzny","s_ds18b20i":"1","s_ds18b20p":" 16","s_ds18b20c":"0.00","s_ds18b20v":"8.69","s_ds18b20t":"23:33:14","s_ds18b20e":"OK","s_ds18b20ec":"0"},{" s_ds18b20nr":"5","s_ds18b20a":"a200000129836628","s_ds18b20n":"CWU","s_ds18b20i":"1","s_ds18b20p":"22","s_ds18b20c":"0.00","s_ds18b20v" :"44.00","s_ds18b20t":"23:33:16","s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":"6","s_ds18b20a":"583c01a816afac28","s_ds18b20n":"Bufor góra","s_ds18b20i":"1","s_ds18b20p":"21","s_ds18b20c": "0.00","s_ds18b20v":"33.06","s_ds18b20t":"23:33:18","s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":"7", "s_ds18b20a":"f83c01a81699f528","s_ds18b20n":"Bufor dół","s_ds18b20i":"1","s_ds18b20p":"19","s_ds18b20c":"0.00","s_ds18b20v":"31,75"," s_ds18b20t":"23:33:20","s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":"8","s_ds18b20a":"643c01a81645bc28","s_ds18b20n":"Zasilanie CO","s_ds18b20i":"1","s_ds18b20p":"17","s_ds18b20c":"0.00","s_ds18b20v": "30.44","s_ds18b20t":"23:33:22","s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":"9","s_ds18b20a":"8a3c01a816192928", "s_ds18b20n":"Powrót CO","s_ds18b20i":"1","s_ds18b20p":"18","s_ds18b20c":"0.00","s_ds18b20v":"27.88","s_ds18b20t":"23:33: 23","s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":"10","s_ds18b20a":"23c01a8163f9c28","s_ds18b20n":"Powrót podłogówki","s_ds18b20i":"1","s_ds18b20p":"59","s_ds18b20c":"0.00","s_ds18b20v":"28,88","s_ds18b20t ":"23:33:25","s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":"11","s_ds18b20a":"6d3c01a816646728","s_ds18b20n":"Temperatura w spoke","s_ds18b":"1","s_ds18b20":"15","s_ds18b20c":"0.00","s_ds18b20v":"22.75","s_ds18b20t":"23:33:27","s_ds18b20e ":"OK","s_ds18b20ec":"0"}]}}:"Powrót podłogówki","s_ds18b20i":"1","s_ds18b20p":"59","s_ds18b20c":"0.00","s_ds18b20v":"28,88","s_ds18b20t":"23:33:25", "s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":"11","s_ds18b20a":"6d3c01a816646728","s_ds18b20n":"Temperatura w instalacji","s_ds18b20i":"1 ","s_ds18b20p":"15","s_ds18b20c":"0.00","s_ds18b20v":"22.75","s_ds18b20t":"23:33:27","s_ds18b20e":"OK","s_ds18b20ec": "0"}]}}:"Powrót podłogówki","s_ds18b20i":"1","s_ds18b20p":"59","s_ds18b20c":"0.00","s_ds18b20v":"28,88","s_ds18b20t":"23:33:25", "s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":"11","s_ds18b20a":"6d3c01a816646728","s_ds18b20n":"Temperatura w instalacji","s_ds18b20i":"1 ","s_ds18b20p":"15","s_ds18b20c":"0.00","s_ds18b20v":"22.75","s_ds18b20t":"23:33:27","s_ds18b20e":"OK","s_ds18b20ec": "0"}]}}s_ds18b20c":"0.00","s_ds18b20v":"28.88","s_ds18b20t":"23:33:25","s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":" 11","s_ds18b20a":"6d3c01a816646728","s_ds18b28b"20b"s_ds18b20i":"1","s_ds18b20p":"15","s_ds18b20c":"0.00","s_ds18b20v":" 22.75","s_ds18b20t":"23:33:27","s_ds18b20e":"OK","s_ds18b20ec":"0"}]}}s_ds18b20c":"0.00","s_ds18b20v":"28.88","s_ds18b20t":"23:33:25","s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":" 11","s_ds18b20a":"6d3c01a816646728","s_ds18b28b"20b"s_ds18b20i":"1","s_ds18b20p":"15","s_ds18b20c":"0.00","s_ds18b20v":" 22.75","s_ds18b20t":"23:33:27","s_ds18b20e":"OK","s_ds18b20ec":"0"}]}}s_ds18b20a":"6d3c01a816646728"n":"Temperatura w"20","s_ds18i":"1","s_ds18b20":"1","s_ds18b20c":"ds18b20c0.00","s_ds18b20v":"22.75"," s_ds18b20t":"23:33:27","s_ds18b20e":"OK","s_ds18b20ec":"0"}]}}s_ds18b20a":"6d3c01a816646728"n":"Temperatura w"20","s_ds18i":"1","s_ds18b20":"1","s_ds18b20c":"ds18b20c0.00","s_ds18b20v":"22.75"," s_ds18b20t":"23:33:27","s_ds18b20e":"OK","s_ds18b20ec":"0"}]}}

Benedyktyńska robota, jest to do zrobienia, ale… bez urazy, na razie z tym Sobie nie poradzisz.
Nie wyklikasz tego i trzeba napisać trochę kodu.
Na początek należałoby się zastanowić, które dane są Ci naprawdę potrzebne.
W tym przypadku aż się prosi przepuścić to przez MQTT i w HA encje same by aktualizowały swoje dane.
Mały przykład co i jak można wyczytać z danych json

flows (20).json (8,8 KB)

Dziękuje za podsunięcie rozwiązania. Faktycznie jest to dość trudne do ogarniecia, ale jak podpowiedziałeś jak czytać te dane to z kolejnymi sobie poradzę. Trzeba tylko kolejne numery tablicy przypisywać w nodzie change. Kiedyś (z 15 lat temu) programowałem, zaczynałem od BASIC na Atari i Commodore, później trochę w c++. Jednak programowanie obiektowe jest dla mnie bardzo, bardzo mało znane.
Możesz jeszcze mnie naprowadzić jak się przepuszcza przez MQTT. Mam uruchomiony serwer i zewnętrznych urządzeń czytam komunikaty mqtt ale z NR dopiero zaczynam i nie do końca ogarniam zastosowanie tych wszystkich nodów.

Z tego przykładu, który zrobiłeś nie wiem jak teraz przypisać do konkretnych encji. Czy muszę te encje tworzyć w pomocnikach i do nich przypisywać wartości za pomocą call service? Dość czasochłonne i mało eleganckie rozwiązanie by to było, tak mi się wydaje.

Myślałem też żeby odczytywać te dane za pomocą configuration.yaml - platform: rest ale to też sporo pisania i konfigurowania.

Jest gotowy nod “mqtt out” - w msg.topic podajesz temat gdzie chcesz zapisać, w msg.payload wartość.
W HA tworzysz encje -platform mqtt i podajesz temat, z kótrego encja dostaje dane.
np.

  - platform: mqtt
    name: "WS-Temperatura min"
    state_topic: "WH2600/TempMin"
    unit_of_measurement: '°C'
    value_template: "{{ value_json }}"
    device_class: temperature   

Z NR wysyłasz do brockera mqtt na ten topic - nic więcej.
Brocker się zajmuje rozsyłaniem danych do subskrybentów (m/inn do encji HA).
Wiecej nie ma sensu pisać…

Zrobiłem tak jak podpowiedziałeś. Utworzyłem w NR mqtt out, skonfigurowałem, nadałem topic
image

w configuration.yaml utworzyłem taki wpis testowy

image

jednak nic nie odczytuje :frowning: . Czy w value_template powinienem podać jakieś bardziej precyzyjne informacje które dane ma czerpać - np coś w tym stylu 18b20.ds18b20read[0].
Nie wiem co tam wpisać.
Komunikaty mqtt są na pewno rozgłaszane bo odbieram je w mqttLens

…uff nawet nie wiem jak Ci to wytłumaczyć?
Wszysko zależy po której stronie wyciagasz paramerty. Po stronie NR to każdy paramert w osobnym temacie. Jeśli w HA to odpowiednie mustasze w value_template… nie podejmuje się wytłumaczenia podstaw mqtt.
Nie jest to trudne i wyglądała jak drzewko katalogów w systemie plików

Ok, będę coś próbował samodzielnie wymodzić. Może ktos inny podpowie :).

Jeszcze jak byś napisał jak przypisać wartość do encji, nie tworząc tej encji w pomocniku to by było świetnie. Chodzi o to jak w tym 1 przykładzie tylko żeby zamiast do Debug zapisywać do encji

Nie da się zapisać do czegoś co nie istnieje :wink:
Musisz coś stworzyć w HA w taki lub w inny sposób.
Pomęcz sie do sam jutra, będę miał czas co dam
działający przykład

Dziękuje, jest nadzieja :). Ja się z tym męczę już od kilku godzin, kombinuje, czytam. Nic nie wychodzi. Jeden przykład na moich danych umożliwił by mi dopisanie reszty.

Próbowałem różnie czytać tego mqtt, kila przykładów, które nie działają.

************
sensor:
  # informacje z LanKontroler
  - platform: mqtt
    name: "WS-Temperatura min"
    state_topic: LanKontroler/18b20/ds18b20read
    unit_of_measurement: "°C"
    value_template: "{{ value_json.s_ds18b20p }}"
    device_class: temperature
************
# informacje z LanKontroler
  - platform: mqtt
    name: "WS-Temperatura min"
    state_topic: LanKontroler
    unit_of_measurement: "°C"
    value_template: "{{ value_json.18b20.ds18b20read.s_ds18b20p }}"
    device_class: temperature
*************
# informacje z LanKontroler
  - platform: mqtt
    name: "WS-Temperatura min"
    state_topic: LanKontroler/18b20/ds18b20read/s_ds18b20p
    unit_of_measurement: "°C"
    value_template: "{{ value_json }}"
    device_class: temperature

I wiele innych prób…

Z informacji o temperaturach potrzebuje tylko te 2 wartości - Nazwa czujnika i Temperatura. Dodatkowo z rs485 i pulse potrzebował bym wszystkich danych. Myślę że bym sobie poradził jeśli podpowiesz mi na 1 czy 2 przykładach odczytu dowolnego parametru z tego JSONa

W NR utworzyłem prosty mechanizm, który wysyła do mqtt i nasłuchuje i wyświetla msg.payload w debug

To jest najbliższe prawidłowego zapisu:

topic w cudzysłowie

state_topic: "LanKontroler"

Cała zabawa jest tu - nie jestem z tego dobry więc nie jestem w stanie poprawić… ale

value_template: “{{ value_json.18b20.ds18b20read.s_ds18b20p }}”

ds18b20read jest “tablicą”

{"ds18b20read":[{"s_ds18b20nr":"0","s_ds18b20a":"ec00000128d86928","s_ds18b20n": "DZ zimna","s_ds18b20i":"1","s_ds18b20p":"24","s_ds18b20c":"0.00","s_ds18b20v":"13.50","s_ds18b20t":"23:33:07"," s_ds18b20e":"OK","s_ds18b20ec":"0"},{"s_ds18b20nr":"1"," ..itd

więc trzeba wskazać, o który czujnik chodzi będzie coś około ds18b20read[0].s_ds18b20p

Może ktoś podpowie … ?
Ja zrobiłbym inaczej - czyli tak jak potrafię :wink: - jutro

Edit… dziś
jtomqtt
flows (21).json (8,3 KB)

Przykład odczytuje temperatury wszystkich czujników DS i umieszcza je w tematach

 "Lancontrol/<NazwaCzujnika>"

W nazwach zmieniane są wszystkie spacje na “_”. W mqttout podajesz tylko brockera i topic zastaje pusty. Unikatowy Topic przekazywany jest w wiadomości msg.topic.

W HA dodajesz czujniki w taki sposób.

  - platform: mqtt
    name: "Temp Bufor Góra"
    state_topic: "Lancontrol/Bufor_góra"
    unit_of_measurement: "°C"
    value_template: "{{ value_json }}"
    device_class: temperature

  - platform: mqtt
    name: "Temp Powrót CO"
    state_topic: "Lancontrol/Powrót_CO"
    unit_of_measurement: "°C"
    value_template: "{{ value_json }}"
    device_class: temperature


...itd

Powinno działać … nie wiem czy kupi w tematach polskie znaki?
Polecam używać MqttExplorer, łatwiej będzie zrozumieć o co “come on”

1 Like

Dziękuje za rozwiązanie mojego problemu. Działa prawie dobrze :slight_smile:
Prawie to chodzi o to że nie wszystkie wartości przesyła do encji.
Widać że polskie znaki nie są problemem bo np “bufor góra” przesyła wartość i zmienia ó na o w nazwie encji.
Podsyłam screen jak to wygląda w podglądzie encji.
Co może być tego przyczyną?
Przy okazji zapytam czy w nowej wersji HA jest możliwość przeładowania samego pliku configuration.yaml ? Wcześniej mogłem go przeładować bez restartu całego HA teraz nie widzę takiej możliwości.

Dobra już temperatury działają świetnie. Jeszcze raz bardzo, bardzo dziękuje.
Na przykładzie tego co podesłałeś udało się mi już utworzyć odczyt wartości pulse.empulseread czyli liczników energii elektrycznej.
Trochę więcej kłopotu mam z odczytem wartości z falownika PV bo jedyne co potrafię zrobić to pojedyncze zmienne odczytywać za pomocą change node, ale to już coś. Utworze tyle tych nodów odczytujących i konwertujących ile jest zmiennych i będzie lux

Nie odczytywało wartości temperatur bo w state_topic nie dałem “_” w nazwie tematu tam gdzie były spacje.
@RobinI30 jeżeli możesz podpowiedzieć czy da się przeładowywać configuration.yaml nie restartując całego HA to by było świetnie.
Pozdrawiam Serdeczne
Robert

Nie da się, to podstawowy plik konfiguracyjny HA, tylko podczas restartu HA są odczytywane parametry.

1 Like

Zrób tak i będzie lux :slight_smile: :

[
    {
        "id": "6bf267634a5ab27f",
        "type": "debug",
        "z": "8e964a7f5509d9c9",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 990,
        "y": 360,
        "wires": []
    },
    {
        "id": "8b3f6f77e8ee02b7",
        "type": "change",
        "z": "8e964a7f5509d9c9",
        "name": "KTL read ",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "payload.rs485.emetersread[0]",
                "tot": "jsonata",
                "dc": true
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 540,
        "y": 360,
        "wires": [
            [
                "d044ad9eba7e80db"
            ]
        ]
    },
    {
        "id": "d044ad9eba7e80db",
        "type": "split",
        "z": "8e964a7f5509d9c9",
        "name": "",
        "splt": "\\n",
        "spltType": "str",
        "arraySplt": 1,
        "arraySpltType": "len",
        "stream": false,
        "addname": "to",
        "x": 680,
        "y": 360,
        "wires": [
            [
                "9a226a9b97823ea5"
            ]
        ]
    },
    {
        "id": "9a226a9b97823ea5",
        "type": "function",
        "z": "8e964a7f5509d9c9",
        "name": "KTL to Mqtt",
        "func": "var msg1 = {};\nmsg1.topic = \"Lancontrol/\" + msg.to.replaceAll(\" \", \"_\");\nmsg1.payload = msg.payload\nreturn msg1;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 830,
        "y": 360,
        "wires": [
            [
                "6bf267634a5ab27f"
            ]
        ]
    }
]

Pozamieniaj tylko w odpowiednich funkcjach wpisy

 "Lancontrol/" +                msg......replaceAll(" ", "_"); 
np. na:
 "Lancontrol/Temp/" +      msg.......replaceAll(" ", "_");
 "Lancontrol/KTL/" +       msg........replaceAll(" ", "_");

Będziesz miał mniejszy bałagan w tematach z podziałem na urządzenia - nie wszystko wrzucone do jednego worka.
json2

1 Like

Tworząc te wszystkie sensory mqtt uwzględnij zawczasu zmiany w tej kwestii jakie przynosi najnowsza aktualizacja core

Zaoszczędzi Ci to później czasu i być może niepotrzebnych nerwów, bo jak widać od września stary format zapisu przestanie działać.

1 Like

@RobinI30 Bardzo dziękuje za Flow i podpowiedź o zmianie nagłówków wiadomości. To jest dokładnie to o co mi chodziło. Działa nawet lepiej niż zakładałem.
Jedyne co musiałem zmienić to dodać jeszcze jedno replaceAll("#","_"); bo w nagłówku nie może być haszy a falownik wysyła nazwę z haszem.

Pozostał mi jeszcze problem przesyłania godziny ostatniego pomiaru. Nie mogę utworzyć odpowiedniej encji do której była by przesyłana godzina w formacje hh:mm:ss

@MariuszT Dziękuje za podpowiedź. Czy jeżeli teraz sformatuje zgodnie z nową zasadą zapisu to będzie działać poprawnie przed opublikowaniem najnowszej aktualizacji?

Nowa aktualizacja już jest, więc myślę że nie ma się nad czym zastanawiać. Póki co nie sprawia żadnych problemów.

1 Like