Zkoumal jsem jak dostat hodnoty z TČ od AC-Heating a možnosti jsou dvě:
- přes protokol
ModBusTCP
- čtením hodnot z
http://<tc_ip>/MAIN1.XML
ahttp://<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: