TČ od Ac-Heating a HomeAssistant

Zkoumal jsem jak dostat hodnoty z TČ od AC-Heating a možnosti jsou dvě:

  1. přes protokol ModBusTCP
  2. čtením hodnot z http://<tc_ip>/MAIN1.XML a http://<tc_ip>/STAVJED1.XML

Podpora AC-Heating zmínila pouze možnost č. 1. a poslala mi dokument s popisem ModbusTCP pro
xCC2. S ModBus nemám žádnou zkušenost ale hlavně tento přístup nemá metriku která mě zajímá a to aktuální spotřebu TČ.
By default se tato metrika nezobrazuje ani v UI a je potřeba, aby to podpora povolila na TČ. Pak se v UI (http://<tc_ip>/stavjed.xml?tab=1) začne zobrazovat i pár dalších metrik. Navíc jde o spotřebu na všech fázích (mé TČ je 3f), dle podpory to TČ neumí, ale to nevadí.

Bod 2. je hack ale, funguje a dostaneme z něj vše co je dostupné v UI a možná i víc.

Já jsem si vystačil jen s daty z http://<tc_ip>/STAVJED1.XML a zde je popis jak je dostat ho HA:

  • Requesty na lokální adresu TČ vyžadují přítomnost cookie SoftPLC=11046282', které funguje jako lame autentifikace. Cookie se vytvoří po přihlášení do UI a nastaví se mu expirace. Pokud tedy vytvoříme cookie bez expirace, jsme v pohodě:

curl --location 'http://10.0.0.15/STAVJED1.XML' --header 'Cookie: SoftPLC=11046282'

10.0.0.15 je lokální IP adresa TČ; doporučuju nastavit pevnou IP (na TČ) a ne DHCP

Detaily cookie neznám, ale není třeba, neboť takto to funguje už víc jak týden.

  • v HA se mi nedařilo vytvořit REST senzor tak dokázal zpracovat XML, tak jsem napsal jednoduchý Python skript, který načte data, upravý a a vrátí jako JSON:
import requests, json, xml.etree.ElementTree as ET

url = "http://10.0.0.15/STAVJED1.XML"
cookies = {"SoftPLC": "18241524"}

conv_dict = {
    "SVENKU" : "outside-temperature",
    "SNAZEV1": "type",
    "SNAZEV2" : "name",
    "SCHYBA" : "has-error",
    "SZAPNUTO" : "is-turned-on",
    "TCSTAV0-FANL" : "fan-lower-rpm",
    "TCSTAV0-TCJ" : "condensate-temperature",
    "TCSTAV0-TS" : "suction-temperature",
    "TCSTAV0-TD" : "displacement-temperature",
    "TCSTAV0-TE" : "evaporator-temperature",
    "TCSTAV0-PROUD" : "current",
    "TCSTAV0-PRIKON" : "power-consumption",
    "TCSTAV0-VYKON" : "power-output",
    "TCMOTOHODINY0" : "running-hours",
}

response = requests.get(url, cookies=cookies)
if response.status_code == 200:
    xml_data = response.content
    root = ET.fromstring(xml_data)
    inputs = root.findall('.//INPUT')

    data_dict = {}
    for elem in inputs:
        if elem.attrib['P'] in conv_dict:
            data_dict[conv_dict[elem.attrib['P']]] = elem.attrib['VALUE']

    print(json.dumps(data_dict))
else:
    print(f"Failed to retrieve data from {url}. Error code: {response.status_code}")

zde je pak senzor (definice v configuration.yaml):

command_line:
  - sensor:
      name: AC Heating XCC2
      unique_id: sensor.ac_heating_xcc2
      command: "python3 /config/scripts/get_ac-heating_xcc2.py"
      value_template: "{{ value_json.type }}"
      json_attributes:
        - outside-temperature
        - name
        - has-error
        - is-turned-on
        - fan-lower-rpm
        - condensate-temperature
        - suction-temperature
        - displacement-temperature
        - evaporator-temperature
        - current
        - power-consumption
        - power-output
        - running-hours

V entities pak máme všechny sensory co jsem si nakonfigurovali ve skriptu:

@skorunka pěkná práce! Ten proud/power je jen za tu jednotku TC, je to tak? Spotřebu topných tyčí v bojleru to neměří?

ACZdravím, ano, je to celé TČ, všechny tři fáze dohromady. Metriky pro externi tyce jsem nenasel. Je ale mozne, ze budou zapoctene v te metrice TC. Zkusim napsat dotaz na podporu AC-H.

@skorunka díky za perfektní čistou implementaci takového hacku :slight_smile:
Zřejmě mám jinou revizi XCC jednotky, takže bylo potřeba adaptovat názvy proměnných při čtení XML.

Ale jak jsi docílil toho že máš senzor pro každý atribut toho command_line sensoru?
Nenapadá mě jiný způsob než pro každý vytvářet samostatný template jako tento:

template:
  - sensor:
      unique_id: sensor.ac_heating_xcc_heatpump-power-percentage
      name: "Heatpump Power"
      state: "{{ state_attr('sensor.ac_heating_xcc', 'heatpump-power-percentage') | default('unknown') }}"
      unit_of_measurement: "%"

Ale pak mi nesedí typ integrace, u tebe vidím Sensor, já mám Template