NEWS
[gelöst] Hargassner HV40 Daten über telnet abgreifen
-
Hallo Zusammen,
Ich hoffe, ich platziere die Anfrage richtig. Wenn nicht, bitte entsprechend verschieben.Wie der Titel schon her gibt, habe ich einen Holzvergaser von Hargassner (HV40) im Einsatz.
Diese Heizung spuckt alle Sekunde seine Mess- und Zustandswerte per telnet ins Netz.Hier ein Datensatzbeispiel (telnet auf IP der Heizung)
pm 32.6 30.1 2.1 29.8 26.1 23.8 0 28.7 120 20 20 30.0 48 0 22 20 0 0 0 0 0 0 1 0 54.2 0 0 80 -20 -20 20 20 -20 0 0 20 20 -20 -20 20 20 -20 0 0 20 20 0 26.1 31.6 11 0 0 0 0 0 0 0 21.7 70.8 0 0 0 0 0 0 0 0 -20 0 20 20 -20 1 1 1 1 1 1 1 20 20 20 20 20 20 20 -20 1 15.9 0 0 0 2 -20 58 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 48 48 63515.2 27524.9 4614.5 1556.7 26.2 7749.6 0 0 1.6 0 0 1 0 0 0 0 0 0 1 0 0 -20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -20 -20 -20 -20 -20 0 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -20 -20 508A 0003 0000 0000 0800 0000 0000 0000Jeder Datensatz beginnt mit "pm".
Jeder Wert ist durch eine Leerstelle getrennt und der Dezimaltrenner ist ein "." Punkt.Von Scripting habe ich nicht wirklich Ahnung.
Kann mir jemand eine möglichst plausible und einfache Lösung aufzeigen, wie ich jeden einzelnen Wert in ein ioBroker Objekt so ca. alle Minute rein schreiben kann?Ich hoffe, die Anfrage ist nicht super blöde und könnte auch anderen helfen.
Schonmal vielen Dank und gutes Neues 2020,
Hogy -
@Hogy Hi, pauschal: ja
Eine Voraussetzung wäre ein Linux-System (mit Shell-Script geht es einfach besser). Eine andere wäre noch, kennst du die Zuweisungen welcher Datenpunkt was ist?
Einen schönen Adapter für den Broker kann ich dir aber nicht bauen, man könnte es höchstens mal mit Javascript versuchen. Das wird bei mir aber ohne passende Heizung schwierig -
@SBorg
Hi und vielen Dank für deine schnelle Antwort.
Ich denke, solch ein Script ließe sich über den Raspberry auf dem auch der ioBroker läuft, realisieren.
Allerdings brauch ich da tatsächlich richtig tatkräftige Unterstützung.Früher hatte ich mal ein kleines Tool auf Windows Basis mit einem Kollegen zusammen gebastelt. Das ging recht gut. Läuft jetzt aber nicht mehr. Somit... ja, die Zuordnungen lassen sich rausfinden. Sind aber aktuell nicht geläufig.
Ich kann die Daten ohne Bedenken ins Internet sicken. Das hab ich auch schon mit dem Windows Toll so gemacht. Hintergrund war damals, dass ich auch von unterwegs sehen wollte, was die Heizung so treibt.Ich habe den Heizungsoutput jetzt einfach mal ins Internet gestellt. (In der Hoffnung, du kannst mir da was gutes basteln)
uei92kmd6x0zmiob.myfritz.net:62323
Mit dem solltest die Daten bekommen. Bei mir funktioniert es jedenfalls.Wenn die Werte in Objekten die irgendwie "hargassner.output.value01" ...02 ...03 heißen, würde mir das genügen. Die Zuordnung mach ich dann.
Schöne Grüße, Hogy
-
@Hogy PI ist schon mal gut
Skript ist auch fertig und funktioniert
Muss aber morgen noch einen kleinen Mehrzeiler schreiben, um die Datenpunkte im ioB anlegen zu lassen. Außer du willst 228(!) Datenpunkte per Hand anlegen -
@SBorg
Respecktvolles wow! Da bin ich ja mal gespannt und mega begeistert.
ne, lass mal... 228 leg ich ungern von Hand an
Also wenn das klappt... HAMMER respeckt! -
@Hogy Sieht so aus
Wirst aber "enttäuscht" sein wenn du siehst wie wenig Programmcode das tatsächlich ist.
Zuerst ioBroker:
- Simple-RESTful-Adapter installieren (keine Einstellungen notwendig)
- neues Javascript "Typ Javascript" anlegen, Name und Ordner beliebig
Dort mittels C&P einfügen:
//Datenobjekte Hargassner anlegen let DP="javascript.0.HV40.value" let ANZ=228 for(let i=0; i<ANZ; i++) { createState(DP+("00" + i).slice(-3),"",{name: "Value "+("00" + i).slice(-3), type: "number", role: "state"}); }
GGf. #2 anpassen, "javascript.x" muss, HV40 wäre der Ordner, value dann der Datenpunkt (siehe meine Hardcopy oben)
Speichern und starten (dauert bei mir 2-3 Sekunden; auf dem PI ev. länger). Wenn dann in den Objekten unter "HV40" der letzte Eintrag "value227" ist, kannst du das Script wieder stoppen.PI:
Ich gehe mal von /home/pi aus.
Per Terminal auf den PI, dann- cd /home/pi
- nano hv40.sh (oder wie du es nennen magst)
- per C&P einfügen
#!/bin/bash DP=javascript.0.HV40.value IPP=192.168.1.3:8087 declare -a MESSWERTE DATA=$(timeout 3 bash -c "nc -v xxx.xxx.xxx.xxx yy") MESSWERTE=($(echo $DATA|cut -d"p" -f2|cut -c2-)) ANZAHL=${#MESSWERTE[@]} #echo Anzahl Datensätze: ${ANZAHL} #echo ${MESSWERTE[*]} for ((i=0; i<${ANZAHL}-1; i++)) do NUM=$(printf "%03d" $i) IOB="${IOB}${DP}${NUM}=${MESSWERTE[$i]}&" done IOB="${IOB}prettyPrint" #echo $IOB curl --data "$IOB" http://${IPP}/setBulk
#3 ggf. anpassen, identisch mit Einstellungen im Javascript
#4 IP und Port des ioBroker (8087 ist der Standard-Port des RESTful-Adapters)
#8 xxx=IP der Heizung / yy=Port der HeizungSpeichern und mittels
sudo chmod +x hv40.sh
ausführbar machen.
Dann mal testen:./hv40.sh
ca. 3 Sekunden später sollten die Messwerte im ioB verfügbar sein...Wenn alles geklappt hat noch einen cronjob anlegen:
sudo crontab -e
z.B. für ein 5-Minutenintervall:*/5 * * * * /home/pi/hv40.sh
Letzte Zeile muss immer eine Leerzeile sein!
-
@SBorg
Um so kürzer, um so begeisteter bin ichAllerdings hab ich scheinbar beim Simpel RESTful API Adapter (V. 2.3.2) schon Probleme.
-
Bzw. Installiert und aktiv ist er.
-
Script ist 1:1 so übernommen
-
Nach Ausführen bekomme ich im LOG diesen Fehler
Ergebnis ist, dass keine Datenpunkte erstellt wurden.
Kann es sein, dass ich hier (Simpel RESTful API Adapter) noch was einstellen muss?
Ansonsten... vielen Dank für die super konkrete und ausführliche Anleitung! Keine Wünsche offen.
-
-
@Hogy Ich vermute zwei Dinge:
- zum einen hast du im ioBroker keinen Längen- und Breitengrad eingetragen ("Schraubenschlüssel" links oben)
- tritt das auch nur deswegen auf, weil du das JS in "global" hast. Es müsste eigentlich unter "common" (dort kannst du dann Ordner anlegen wie du willst + da dürfte ihm dein Wohnort egal sein, zumindest braucht das JS es nicht)
-
@SBorg
DANKE! Der zweite Punkt wars. Jetzt läuft/lief es und die Datenpunkte sind erstellt.Mein Fall ist somit gelöst.
Daten sind da und der schedule läuft.
SUPER schnelle Sache!Ich poste das Ergebnis, sobald ich die notwendigen Werte im Vis dargestellt habe.
-
@All
so schaut bei mir das Ergebnis auf meinem S8 Handy aus. Rot umrahmt die Daten, die von der Heizung geliefert werden.
Die Werte sind zudem bewertet. Heißt...
Weiße Schrift: Aktueller Wert und sinnig
Graue Schrift: Aktueller Wert nicht sinnig (Weil z.B. der Brenn gerade nicht arbeitet)
Grüne Schrift: Aktueller Wert, alles in Ordnung
Gelbe Schrift: Aktueller Wert, hier könnte/sollte was unternommen werden
Rote Schrift: Aktueller Wert, hier muss eine Aktion erfolgen (Z.B. Holz nachlegen weil Brauchwassertemp. unter definierter Grenze)
Evtl. kann/möchte das jemand adaptieren.
-
Sehr geil, werde ich mal im Auge behalten. Wenn mein Heizungsbauer aus dem Urlaub zurück und wieder einsatzfähig ist werde ich auch mein Wlan Modul für meine Harrgassner Heizung bestellen. Mal sehen ob da auch sowas in der Richtung geht...
-
Bei unserem HV40 ist ein LAN Anschluss mit dabei.
Die Daten für die Anzeige saug ich mir alle 20 Sekunden.
Alle Minute schreibe ich einen Datensatz in die Historie und lass mir diese über VIS darstellen.
-
Hi, da bin ich interessiert. Wie habt Ihr die Zuordnung der Werte aus demDatenstrom zu echten Werten gemacht? Also woher wisst Ihr welches Byte was bedeuted? Gibt es da eine Übersicht?
Grüße
jpgorganizer -
@jpgorganizer Ich weiß nicht ob @Hogy hier noch mit liest, aber er wird wohl die Werte verglichen haben lt. Anzeige der Heizung. Von mir stammt nur das reine Skript ohne jegliche Zuordnung.
-
@SBorg hast Recht. Ich habe die Werte, mit den Werten auf der Heizung verglichen.
@jpgorganizer Solltest eine Liste brauchen, das was ich ermittelt habe, stell ich gerne zur Verfügung. -
@Hogy
au das wär toll.@SBorg
du hast das script gemacht. Warum als script und keinen Adapter dafür? gab es Gründe?Ich würde mir beides Liste + Script in den nächsten Tagen mal anschauen und wenn ich damit zurecht komme und es mit meiner Heizung grundsätzlich mal funktioniert, dann würde ich mich ggfs. hinsetzen und einen Adapter schreiben.
Darf ich dann eure Grundlage verwenden?Mal sehen ... vmtl. bekomme ich dann zwar Ärger mit meiner Frau, weil ich nicht mehr vom PC wegkomme. Aber irgendwas muss man ja gerade tun.
VG jpgorganizer
-
@jpgorganizer sagte in Hargassner HV40 Daten über telnet abgreifen:
du hast das script gemacht. Warum als script und keinen Adapter dafür? gab es Gründe?
Ja
Man braucht nicht immer für alles und jedes einen Adapter. Mein Motto: Keep it lean, clean and simple
Als Adapter schleppt man gleich einen irrsinnigen Overhead mit sich rum. Als Skript benötigt es kaum Speicher und CPU-Ressourcen und überlebt so ziemlich jedwedes Update. Inkompatibilitäten wegen eines JS-, Node...-Updates gibt es da nicht.Da es keine Atomwissenschaft ist, kannst du daraus auch selbstverständlich einen Adapter basteln. Schließlich grenze ich damit die Windows-User aus, auch wenn sich noch keiner beschwert hat
-
@jpgorganizer
hier die Objekte mit der Beschreibung, wofür ich sie halte."name": "HV40 Wassertemperatur", "name": "Value 000", "name": "Abgase Ist", "name": "Value 001", "name": "O² Ist", "name": "Value 002", "name": "Puffer Oben", "name": "Value 003", "name": "Puffer Mitte", "name": "Value 004", "name": "Puffer Unten", "name": "Value 005", "name": "Außentemperatur", "name": "Value 006", "name": "Heizung Vorlauf Ist", "name": "Value 007", "name": "Value 008", "name": "Value 008", "name": "Value 009", "name": "Value 009", "name": "Value 010", "name": "Value 010", "name": "Brauchwasser", "name": "Value 011", "name": "Heizung Vorlauf Soll", "name": "Value 012", "name": "Value 013", "name": "Value 013", "name": "Value 014 ?", "name": "Value 014", "name": "Value 015", "name": "Value 015", "name": "Primärluft Soll", "name": "Value 016", "name": "Primärluft Ist", "name": "Value 017", "name": "Sekundärluft Soll", "name": "Value 018", "name": "Sekundärluft Ist", "name": "Value 019", "name": "Saugzug Ist", "name": "Value 020", "name": "Value 021", "name": "Value 021", "name": "Status", "name": "Value 022", "name": "O² Soll", "name": "Value 023", "name": "Lambdasonde ?", "name": "Value 024", "name": "Value 025", "name": "Value 025", "name": "Saugzug Soll", "name": "Value 026", "name": "Value 027", "name": "Value 027", "name": "Value 028", "name": "Value 028", "name": "Value 029", "name": "Value 029", "name": "Value 030", "name": "Value 030", "name": "Value 031", "name": "Value 031", "name": "Value 032", "name": "Value 032", "name": "Value 033", "name": "Value 033", "name": "Value 034", "name": "Value 034", "name": "Value 035", "name": "Value 035", "name": "Value 036", "name": "Value 036", "name": "Value 037", "name": "Value 037", "name": "Value 038", "name": "Value 038", "name": "Value 039", "name": "Value 039", "name": "Value 040", "name": "Value 040", "name": "Value 041", "name": "Value 041", "name": "Value 042", "name": "Value 042", "name": "Value 043", "name": "Value 043", "name": "Value 044", "name": "Value 044", "name": "Value 045", "name": "Value 045", "name": "Leistung", "name": "Value 046", "name": "Heizungselektronik", "name": "Value 047", "name": "Boiler Vorlauf Ist", "name": "Value 048", "name": "Puffer Füllgrad", "name": "Value 049", "name": "Value 050", "name": "Value 050", "name": "Value 051", "name": "Value 051", "name": "Value 052", "name": "Value 052", "name": "Value 053", "name": "Value 053", "name": "Value 054", "name": "Value 054", "name": "Value 055", "name": "Value 055", "name": "Value 056", "name": "Value 056", "name": "Ölheizung", "name": "Value 057", "name": "Boiler Vorlauf Soll", "name": "Value 058", "name": "Außentemperatur gemittelt", "name": "Value 059", "name": "Value 060", "name": "Value 060", "name": "Value 061", "name": "Value 061", "name": "Value 062", "name": "Value 062", "name": "Value 063", "name": "Value 063", "name": "Value 064", "name": "Value 064", "name": "Value 065", "name": "Value 065", "name": "Value 066", "name": "Value 066", "name": "Value 067", "name": "Value 067", "name": "Value 068", "name": "Value 068", "name": "Value 069", "name": "Value 069", "name": "Value 070", "name": "Value 070", "name": "Value 071", "name": "Value 071", "name": "Value 072", "name": "Value 072", "name": "Value 073", "name": "Value 073", "name": "Value 074", "name": "Value 074", "name": "Value 075", "name": "Value 075", "name": "Value 076", "name": "Value 076", "name": "Value 077", "name": "Value 077", "name": "Value 078", "name": "Value 078", "name": "Value 079", "name": "Value 079", "name": "Value 080", "name": "Value 080", "name": "Value 081", "name": "Value 081", "name": "Value 082", "name": "Value 082", "name": "Value 083", "name": "Value 083", "name": "Value 084", "name": "Value 084", "name": "Value 085", "name": "Value 085", "name": "Value 086", "name": "Value 086", "name": "Value 087 ?", "name": "Value 087", "name": "Value 088 ?", "name": "Value 088", "name": "Value 089", "name": "Value 089", "name": "Value 090", "name": "Value 090", "name": "Value 091", "name": "Value 091", "name": "Value 092 ?", "name": "Value 092", "name": "Value 093", "name": "Value 093", "name": "Value 094 ?", "name": "Value 094", "name": "Value 095", "name": "Value 095", "name": "Value 096", "name": "Value 096", "name": "Value 097", "name": "Value 097", "name": "Value 098", "name": "Value 098", "name": "Value 099", "name": "Value 099", "name": "Value 100", "name": "Value 100", "name": "Value 101", "name": "Value 101", "name": "Value 102", "name": "Value 102", "name": "Value 103", "name": "Value 103", "name": "Value 104", "name": "Value 104", "name": "Value 105", "name": "Value 105", "name": "Value 106", "name": "Value 106", "name": "Value 107", "name": "Value 107", "name": "Value 108", "name": "Value 108", "name": "Value 109", "name": "Value 109", "name": "Value 110", "name": "Value 110", "name": "Value 111", "name": "Value 111", "name": "Value 112", "name": "Value 112", "name": "Value 113", "name": "Value 113", "name": "Value114 ?", "name": "Value 114", "name": "Value115 ?", "name": "Value 115", "name": "Value 116", "name": "Value 116", "name": "Value 117", "name": "Value 117", "name": "Value 118", "name": "Value 118", "name": "Value 119", "name": "Value 119", "name": "Value 120", "name": "Value 120", "name": "Value 121", "name": "Value 121", "name": "Value 122", "name": "Value 122", "name": "Value 123", "name": "Value 123", "name": "Value 124", "name": "Value 124", "name": "Value 125", "name": "Value 125", "name": "Value 126", "name": "Value 126", "name": "Value 127", "name": "Value 127", "name": "Value 128", "name": "Value 128", "name": "Value 129", "name": "Value 129", "name": "Value 130", "name": "Value 130", "name": "Betriebsstunden Steuerung", "name": "Value 131", "name": "Betriebsstunden Heizung", "name": "Value 132", "name": "Betriebsstunden Leistungsbrand", "name": "Value 133", "name": "Value 134 ?", "name": "Value 134", "name": "Betriebsstunden Zündung", "name": "Value 135", "name": "Betriebsstunden Saugzug", "name": "Value 136", "name": "Value 137", "name": "Value 137", "name": "Value 138", "name": "Value 138", "name": "Value139 ?", "name": "Value 139", "name": "Value 140", "name": "Value 140", "name": "Value 141", "name": "Value 141", "name": "Value 142 ?", "name": "Value 142", "name": "Value 143", "name": "Value 143", "name": "Value 144", "name": "Value 144", "name": "Value 145", "name": "Value 145", "name": "Value 146", "name": "Value 146", "name": "Value 147", "name": "Value 147", "name": "Value 148", "name": "Value 148", "name": "Value 149", "name": "Value 149", "name": "Value 150", "name": "Value 150", "name": "Value 151", "name": "Value 151", "name": "Value 152", "name": "Value 152", "name": "Value 153", "name": "Value 153", "name": "Value 154", "name": "Value 154", "name": "Value 155", "name": "Value 155", "name": "Value 156", "name": "Value 156", "name": "Value 157", "name": "Value 157", "name": "Value 158", "name": "Value 158", "name": "Value 159", "name": "Value 159", "name": "Value 160", "name": "Value 160", "name": "Value 161", "name": "Value 161", "name": "Value 162", "name": "Value 162", "name": "Value 163", "name": "Value 163", "name": "Value 164", "name": "Value 164", "name": "Value165 ?", "name": "Value 165", "name": "Value 166", "name": "Value 166", "name": "Value 167", "name": "Value 167", "name": "Value 168", "name": "Value 168", "name": "Value 169", "name": "Value 169", "name": "Value 170", "name": "Value 170", "name": "Value 171", "name": "Value 171", "name": "Lambdasonde Spannung", "name": "Value 172", "name": "Value173 ?", "name": "Value 173", "name": "Value 174", "name": "Value 174", "name": "Value 175", "name": "Value 175", "name": "Value 176", "name": "Value 176", "name": "Value 177", "name": "Value 177", "name": "Value 178", "name": "Value 178", "name": "Value 179", "name": "Value 179", "name": "Value 180", "name": "Value 180", "name": "Value 181", "name": "Value 181", "name": "Value 182", "name": "Value 182", "name": "Value 183", "name": "Value 183", "name": "Value 184", "name": "Value 184", "name": "Value 185", "name": "Value 185", "name": "Value 186", "name": "Value 186", "name": "Value 187", "name": "Value 187", "name": "Value 188", "name": "Value 188", "name": "Value 189", "name": "Value 189", "name": "Value 190", "name": "Value 190", "name": "Value 191", "name": "Value 191", "name": "Value 192", "name": "Value 192", "name": "Value 193", "name": "Value 193", "name": "Value 194", "name": "Value 194", "name": "Value 195", "name": "Value 195", "name": "Value 196", "name": "Value 196", "name": "Value 197", "name": "Value 197", "name": "Value 198", "name": "Value 198", "name": "Value 199", "name": "Value 199", "name": "Value 200", "name": "Value 200", "name": "Value 201", "name": "Value 201", "name": "Value 202", "name": "Value 202", "name": "Value 203", "name": "Value 203", "name": "Value 204", "name": "Value 204", "name": "Value 205", "name": "Value 205", "name": "Value 206", "name": "Value 206", "name": "Value 207", "name": "Value 207", "name": "Value 208", "name": "Value 208", "name": "Value 209", "name": "Value 209", "name": "Value 210", "name": "Value 210", "name": "Value 211", "name": "Value 211", "name": "Value 212", "name": "Value 212", "name": "Value 213", "name": "Value 213", "name": "Value 214", "name": "Value 214", "name": "Value 215", "name": "Value 215", "name": "Value 216", "name": "Value 216", "name": "Value 217", "name": "Value 217", "name": "Value 218", "name": "Value 218", "name": "Value 219", "name": "Value 219", "name": "Value 220 ?", "name": "Value 220", "name": "Türe", "name": "Value 221", "name": "Value 222", "name": "Value 222", "name": "Value 223", "name": "Value 223", "name": "Value 224", "name": "Value 224", "name": "Value 225", "name": "Value 225", "name": "Value 226", "name": "Value 226", "name": "Value 227", "name": "Value 227",
Der erste "name" ist die Beschreibung was der Wert darstellen sollte. Der zweite "name" ist das Objekt.
Beispiele:
"Value 000" ist "HV40 Wassertemperatur"
...
"Value 007" ist "Heizung Vorlauf Ist"
...
"Value 012" ist "Heizung Vorlauf Soll"
... -
@Hogy Danke, ich werde das mal vergleichen mit meinen Daten.
Da die Heizung aber aktuell nicht mehr läuft - es ist Sommer - muss ich mal schauen wie ich das macheGrüße
jpgorganizer -
@jpgorganizer
würde mich sehr freuen, wenn du deine Erkenntnisse teilen würdest. Solltest du weitere Wertzuordnungen finden, dann lass es mich bitte wissen.
Hast du auch eine HV40 oder ist das eine Andere? Wenn eine Andere... welche?Grüße, Hogy