Heizungssteuerung mit VCLIENT (Version 0.2.11f)

Begonnen von andies, 16 Oktober 2017, 21:51:13

Vorheriges Thema - Nächstes Thema

andies

Danke - inzwischen heize ich Warmwasserbereitung auch nur noch zweimal am Tage (und das zweite Mal nur kurz), als nächstes kommt im Winter die Heizkurve dran. Da ist wirklich sehr viel Spielraum, finde ich.


Gesendet von iPhone mit Tapatalk Pro
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

phantom

Hi andies,

zunächst erstmal besten Dank insb. an dich (und CoolTux) für die Zeit und Mühen, die in 98_VCLIENT.pm geflossen sind !
Auch ich habe schon seit gut 10 Jahren einen vcontrold laufen zur Auswertung meiner Vitotronic 200 (Viessmann KW-Protokoll). Da bietet sich ja dein Modul für FHEM an, zumal der vcontrold auf einem anderen System läuft ...

Zwei Fragen hätte ich dazu:
a) Da ich parallel zu FHEM den vcontrold regelmäßig stets alle geraden 4 Minuten befrage, kommt der sich mit dem VCLIENT ab und zu ins Gehege bei überschneidenen Abfragen.
    Gibt es eine Möglichkeit das Default Intervall z.B. zu ungerade Minuten zu starten oder wie kann man so etwas per "timer" in der Vclient.cfg einstellen. (z.B. alle ungeraden X-Minuten) ?

b) Ab und zu kann der vcontrold keine sinnvollen Daten liefern (z.B. wenn man die Vitotronic 200 zu häufig befragt oder parallel einen Fernthermostat bedient).
    Könnte man in solchen Fällen einfach den letzten gültigen Wert im Reading mit dessen Zeitstempel stehen lassen (evtl. als Konfig-Option dafür) ?
    Derzeit bekommt man "Unkown buffer format" als Reading-Value, was sich für die grafische Auswertung weniger eignet.

Besten Gruß 
Phantom

andies

Zitat von: phantom am 08 Dezember 2018, 14:59:42
a) Da ich parallel zu FHEM den vcontrold regelmäßig stets alle geraden 4 Minuten befrage, kommt der sich mit dem VCLIENT ab und zu ins Gehege bei überschneidenen Abfragen.
    Gibt es eine Möglichkeit das Default Intervall z.B. zu ungerade Minuten zu starten oder wie kann man so etwas per "timer" in der Vclient.cfg einstellen. (z.B. alle ungeraden X-Minuten) ?
Hi Phantom, Du meinst, dass von zwei verschiedenen Geräten aus auf vcontrold zugegriffen wird? Du kannst ja den timer=0 setzen, dann wird nur manuell ausgelöst. Allerdings müsste dann FHEM wissen, ob das zweite Gerät gerade zugreift. Oder eben timer=7, dann kommen die sich alle 4*7=48 Minuten in die Quere.

Wieso hast Du denn über zwei Geräte die Zugriffe? Was macht das andere Gerät? Würde denn FHEM nicht genügen?   


Zitat von: phantom am 08 Dezember 2018, 14:59:42
b) Ab und zu kann der vcontrold keine sinnvollen Daten liefern (z.B. wenn man die Vitotronic 200 zu häufig befragt oder parallel einen Fernthermostat bedient).
    Könnte man in solchen Fällen einfach den letzten gültigen Wert im Reading mit dessen Zeitstempel stehen lassen (evtl. als Konfig-Option dafür) ?
    Derzeit bekommt man "Unkown buffer format" als Reading-Value, was sich für die grafische Auswertung weniger eignet.
Im Grunde ja, nur manchmal ist nicht klar, was genau ein Fehler ist. Wenn zB die Kesseltemperatur = 65000° ist, ist das logischerweise ein Fehler. Aber dass =103° auch einer ist, ist nicht so leicht erkennbar. Wenn da Texte drin stehen, könnte man das vermutlich löschen.

Wie wertest Du aus? Ich nehme grafana und dann sieht das so aus wie unten, trotz einer Fehlermeldung in der Nacht.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

phantom

Hi andies,

zu a) ich habe eine Datenbank-Anwendung, die auch auf den vcontrold zugreift. Das liefert schon seit 10 Jh. und möchte ich aufgrund der Historie der Daten darin so belassen.
        Diese Anwendung hat ein festes Abfrageraster zu gerade Minuten (jede 4. / 8. / 12. / ...)
        FHEM sollte dazwischen liegen.
        Wäre das Intervall im Define dann auf 0 zu setzen und alles mit den Timern in der Vclient.cfg zu regeln?
        Wie genau sind diese zu verstehen?  Könnte man dort z.B.  3,7,11,12,... für die ungeraden (nicht überschneidenen) Minuten eintragen?
        Mir ist die Syntax der Timer (noch) nicht klar.

zu b) wenn ich mit verbose=5 logge sehen die Fehler z.B. so aus:
2018.12.08 15:16:33 5: Vitotronic: Requesting getTempWWist now
2018.12.08 15:16:37 3: Vitotronic: Received 49.1 for Warmwassertemperatur
2018.12.08 15:16:37 5: Vitotronic: Requesting getTempA now
2018.12.08 15:16:42 1: DEBUG>Vitotronic: buf ERR: read timeout
Fehler wait, Abbruch
Fehler beim ausfuehren von getTempA

2018.12.08 15:16:42 3: Vitotronic: Received Vitotronic: Unkown buffer format for Aussentemperatur
2018.12.08 15:16:43 5: Vitotronic: Closing vcontrold connection


Sonstige fehlerhaft zurückgelieferte Wert filtert meinen andere DB-Anwendung auch raus.
Da kommt aber bei mir nur 2 Fehlerzustände vor
Werte über 100°C oder Texte in Zahlenfelden werden durch den Vorgänger ersetzt


phantom

Nachtrag zu den filterbaren Fehlerwerten:

  • Die Vitotronic gibt bei Abfrage mit dem vcontrold seit vielen Jahren ca. 2-3 mal am Tag Temperaturen über 100°C (bei mir stets 128.10) als unsinnige Werte zurück.
  • Das macht sie auch bei Statusabfragen (z.B. ZirkuPumpe), da sind korrekte Stati  1 oder 0  und eben nichts > 100
  • Seltener kommt ein Fehler bei den Betriebsstunden, hier verwerfe ich alle Werte die kleiner als der Vorgänger sind.
Wäre es nicht sinnvoll so etwas mal vorzusehen?  (falls es einfach zu machen ist)

Gruß Phantom

andies

Zitat von: phantom am 08 Dezember 2018, 15:33:34
        Wäre das Intervall im Define dann auf 0 zu setzen und alles mit den Timern in der Vclient.cfg zu regeln?
Nicht mit Timern. Du setzt im define auf 0 und stößt dann die Abfrage durch einen eigenen get-Befehl an, also
get <DeinDeviceName> update
Das muss Du dann zu den Dir genehmen Minuten "manuell" (at?) machen.


Zitat von: phantom am 08 Dezember 2018, 15:33:34
zu b) wenn ich mit verbose=5 logge sehen die Fehler z.B. so aus:
2018.12.08 15:16:33 5: Vitotronic: Requesting getTempWWist now
2018.12.08 15:16:37 3: Vitotronic: Received 49.1 for Warmwassertemperatur
2018.12.08 15:16:37 5: Vitotronic: Requesting getTempA now
2018.12.08 15:16:42 1: DEBUG>Vitotronic: buf ERR: read timeout
Fehler wait, Abbruch
Fehler beim ausfuehren von getTempA

2018.12.08 15:16:42 3: Vitotronic: Received Vitotronic: Unkown buffer format for Aussentemperatur
2018.12.08 15:16:43 5: Vitotronic: Closing vcontrold connection

Also die Wassertemperatur kriegt er, die Außentemperatur aber nicht.

Nenn mir mal hier die vonctrold-Befehle, die Du von FHEM implementiert haben willst. Und sage mir, wie das reading heißen soll, dass dann die Rückgabe speichern soll. Ich zeige dann, wie das geht.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Zitat von: phantom am 08 Dezember 2018, 15:58:39
Wäre es nicht sinnvoll so etwas mal vorzusehen?  (falls es einfach zu machen ist)
Also, die Stelle, an die das muss, ist diese hier:
my @zeilen=split /\n/, $buf;
# Anzahl uebergebener Zeilen
my $zeilen = @zeilen;

# hier gibt es zwei Moeglichkeiten: Entweder enthaelt $buf nur eine Zeile,
# dann kommt das Ergebnis gleich am Anfang (danach steht die Masseinheit).
if ($zeilen == 1 ) {
my @results = split /[ ]/, $zeilen[0]; # split around empty_space
# ueblicherweise stehen hier numerische Angaben, ausser zB bei der Betriebsart
if (looks_like_number($results[0])){
$value = sprintf("%.1f", $results[0]); #rounding to, for example, 16.6
} else {
$value = $results[0]; #Buchstaben fuer Betriebsart u.Ae.
}

Ich brauche dann aber eine Logik, nach der aussortiert wird. Man würde dann eine Fehlermeldung erzeugen ("Wert zu groß" oder so) und das dann nachfolgende    readingsSingleUpdate($hash, $reading, $value, 1) unterlassen - dann bleibt der alte Wert stehen.

Nur die Logik kapiere ich noch nicht. Das muss ja irgendwie für alle Werte Sinn ergeben.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

phantom

Als Logik zur Fehlererkennung bietet sich z.B. an alle Temperaturen über 110°C rauszuwerfen.  Die haben den Substring ... Temp ... im vcontrol-command.
Ebenso haben die Statuswerte ein ... Status ... im vcontrol-command.
Die ViessmannStati sind binär  0 oder 1 .

Wenn für solch eine Wert dann über 110 zurückkommt könnte dies als Fehler rausfliegen (oder die Heizung ist schon beim explodieren  :-\ )

Desweiteren sollte, wenn es Wert mal gar nicht ausgelesen werden nicht "Unkown buffer format" im Zahlen/Statuswert stehen
Es kommen leider ab und an read-timeouts einzelner Werte vor (s. vorheriges Beispiel)

Hilft dies weiter und sieht du dies auch als sinnvoll an?
Phantom

phantom

hier noch eine Kleinigkeit, die Abfrage der Viessmann-Zeit/Datum per vclient liefert:
./vclient -h localhost:3002 -c getSystemTime
getSystemTime:
Sa,08.12.2018 17:13:40

in VCLIENT fehlt beim Reading die Uhrzeit:
VitotronicSystemzeitSa,08.12.2018
   
2018-12-08 17:14:41

phantom

zu früh abgesendet...

ich setze z.B. die Viessmann Zeit so:
./vclient -h localhost:3002 -c "unit off,setSystemTime `date "+%C %y %m %d 0%u %H %M %S"`,unit on"`

meine kann keine Sommer/Winterzeitumstellung ...

So wäre es schön, wenn diese auch in FHEM zur Kontrolle mit angezeigt würde.
Der String wird wohl hinter dem Leerzeichen nicht weiter ausgewertet und endet dann mit dem Datum ohne die Zeit dahinter ?

Gruß Phantom

andies

Zitat von: phantom am 08 Dezember 2018, 16:23:41
Hilft dies weiter und sieht du dies auch als sinnvoll an?
Ich habe mal was eingebaut, siehe Anhang. Drei Dinge:

  • Das gibt bei mir jetzt keine Fehlermeldung, aber das heißt nichts. Du musst also testen und ich kann nur hoffen, dass es da keine Probleme gibt.
  • Du lädst die Datei in FHEM und rufst dann "reload 89_VCLIENT.pm" auf. Das reicht aber nicht.
  • Du musst danach den config.file neu einladen, sonst werden die Variablen nicht aktualisiert. Also "set <Device> reload_command_file <Dateiname_mit_pfad>".
Da ist jetzt eine Integritätsprüfung drin. Die sieht momentan so aus:
sub VCLIENT_integrity_check($)
{
my $value = shift;
my $integrity = 1;
#Temperaturen muessen unter 110 Grad Celsius sein
if ($last_cmd =~ /(T|t)emp/)
{
$integrity = ($value < 110);
}
#Status darf nur 0 oder 1 sein
if ($last_cmd =~ /status/)
{
$integrity &&= ($value =~ /(0|1)/);
}
return $integrity;
}

Also wenn irgendwas mit temp im letzten Kommando, muss die Rückgabe < 110 sein. Wenn irgendwas mit status im letzten Kommando, muss die Rückgabe 0 oder 1 sein. Mal sehen, ob das was bringt.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Zitat von: phantom am 08 Dezember 2018, 17:16:23
hier noch eine Kleinigkeit, die Abfrage der Viessmann-Zeit/Datum per vclient liefert:
Ich kann doch nur vcontrold. Gibt es da einen Befehl?
ZitatDieses Modul funktioniert nur, wenn auf einem (externen) Host vcontrold installiert wurde und fehlerfrei läuft.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

phantom

zur Zeit / Datum Einstellung:

Auf dem System, auf dem der vcontrold läuft, gibt es auch den shell-Befehl names "vclient" mit dem man den vcontrold direkt (oder über Netz) ansprechen kann.
z.B.  holt   ./vclient -h localhost:3002 -c "getSystemTime"    die Viessmann-Uhrzeit+Datum
oder ./vclient -h localhost:3002 -c "commands"  liefert alle in der vito.xml definierten Befehle (die sollten zum Heizungsmodell passen !)

mit dem oben erwähnten Befehl setzte ich per cron Sommer- / Winterzeit  (dabei muß ein unit off davor und unit on dahinter kommen)

für den VCLIENT wäre es schön, wenn mit Config:  "getSystemTime VitotronicSystemzeit daily" die Viessmann-Zeit mitlkäme
derzeit kommt nur "Sa,08.12.2018"  ,   d.h. die Zeit, die auf diesen String folgt wird abgeschnitten.

frag nach, wenn dies unklar ist
Phantom

P.S.:  die angehängte neue Version von VCLIENT ist soeben installiert, später mehr dazu




andies

#58
Kannst du mal das ausprobieren? Da müsste jetzt das Datum komplett kommen. Ich hatte den hinteren Part immer entfernt, weil der normalerweise die Maßeinheit enthielt. Ist jetzt drin, wenn der erste Teil keine Zahl ist (und das ist er beim Datum nicht).

<edit> Da ist noch was faul, warte mal.
<edit>repariert.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

phantom

hier meine Test-Erkenntnisse:

a) das mit der Systemzeit klappt nun

b) wenn vcontrold gar nichts zurückliefern kann kommt als Reading z.B. :  "TempSoll_Warmwasser    Vitotronic: Unkown buffer format"
    und im verbose-5 Log sieht das so aus:
2018.12.08 18:26:02 5: Vitotronic: Requesting getTempWWist now
2018.12.08 18:26:07 1: DEBUG>Vitotronic: buf ERR: read timeout
Fehler wait, Abbruch
Fehler beim ausfuehren von getTempWWist

2018.12.08 18:26:07 3: Vitotronic: Received Vitotronic: Unkown buffer format for Warmwassertemperatur
2018.12.08 18:26:07 1: PERL WARNING: Argument "Vitotronic: Unkown buffer format" isn't numeric in numeric lt (<) at ./FHEM/89_VCLIENT.pm line 321.

dort ist die Ausgabe ja bei verbose>3 auch OK  (bis auf den kleinen BUG in line 321 ...)

c) ansonsten wäre es schön, wenn die Statuswerte ohne Nachkommastellen als Integer (0|1) ausgegeben würden, wie viele andere FHEM-Stati auch

d) der Integritycheck auf >110°C sieht OK aus,  das wird bestimmt heute och vorkommen, sonst muss ich es simulieren

Phantom