Heizungssteuerung mit VCLIENT (Version 0.2.11f)

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

Vorheriges Thema - Nächstes Thema

mumpitzstuff

#90
https://www.perlmonks.org/bare/?node_id=451914

https://docstore.mik.ua/orelly/perl4/cook/ch07_21.htm

Es gibt auch noch andere Wege das zu umgehen, falls das wirklich die Ursache für dein Problem ist. Und blockieren tut es nur, wenn absolut gar keine Daten gelesen werden können. Sobald irgendein Zeichen gelesen werden kann, kommt die Funktion umgehend zurück.

andies

#91
ich habe die Leseroutine jetzt so umgeschrieben, mal sehen, was passiert:

sub VCLIENT_Read($){
    my ($hash) = @_;
    my $buf = '';
    my $select = IO::Select->new($hash->{CD}); # see forum, blocking call with empty sysread

    if ($select->can_read(0.1)) #timeout 0.1 Sekunden
    {
sysread($hash->{CD}, $buf, 1024);
    }

    if (!$buf){
VCLIENT_Close_Connection($hash);
return;
    }
    #remove prompt and trailing empty lines
    $buf =~ s/\r//g;
    $buf =~ s/vctrld>//g;
    $buf =~ s/\n$//;

    if ($buf ne "") {
VCLIENT_ParseBuf_And_WriteReading($hash, $buf);
    }
}
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

Also, das hat jetzt geklappt. Ich hatte nachts wieder eine Fehlermeldung der Form
2019.05.25 00:00:33 1: [YAAHM_updater] <was auch immer>
2019.05.25 02:11:19 1: Viessmann timeout: Was not able to receive a signal from 192.168.2.105:3002. Deleting command queue.
2019.05.25 04:58:03 1: IPCAM <was auch immer>

und diesmal ging die CPU nicht auf 100% hoch. Vielen Dank, mumpitzstuff, Problem eigentlich gelöst. Aber ich kapiere dennoch etwas nicht. Der Code sieht bei mir nämlich so aus:
    if ($select->can_read(0.1)) #timeout 0.1 Sekunden, FHEM blockiert sonst!
    {
sysread($hash->{CD}, $buf, 1024);
    }

    if (!$buf){
Log3 $name, 1,  "$name: connection closed unexpectedly"; #kann hier eigentlich nicht passieren
VCLIENT_Close_Connection($hash);
return;
    }

und wenn $buf leer gewesen wäre (weil nicht von sysread gefüllt und vorher gerade erst definiert), hätte ich doch einen weiteren Eintrag im Logfile haben müssen?!

Mir ist noch etwas aufgefallen. Ich lese mir das ja alles an und habe viel Copy-and-paste gemacht. Bis vor wenige Tagen stand unter dem Code noch folgende Zeile:

sysread($hash->{CD}, $buf, 1024);
...
unless (defined $buf){
Log3 $name, 5,  "$name: no data received"; #continue reading
return;
}

Das habe ich auch gelöscht. Könnte das für die Blockade verantwortlich gewesen sein? Allerdings habe ich diese Zeile nie in meinem Logfile gefunden. (Irgendwie ist das rätselhaft.)
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

CoolTux

my $buf = '';

Dein $buf ist ja nicht leer.  Weil '' nunmal auch ein Zeichen ist.
Teste mal mit einem my $buf;.
Was ich aber nicht verstehe ist das ja eigentlich die Read Funktion nur aufgerufen werden sollte wenn Daten am Socket zum lesen anliegen.

Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

andies

Zu früh gefreut:
load average: 0,87, 0,94, 0,91
Also das Problem ist noch da. Allerdings sehe ich diesmal weder ein timeout noch ein telnet-Zugriffsproblem. Kann es sein, dass das am Ende was völlig anderes ist?

Es gab doch mal Meldungen darüber, dass FHEM blockiert und keiner wusste, woran es lag.
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

CoolTux

Ich denke eher Du meinst den stetigen Speicheranstieg. Oder?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

andies

Ja, genau den. Stimmt, das ist nicht 100% CPU...
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

nachdem ich nachts eine Ausfall und dennoch keine 100%-cpu hatte, betrachte ich den fall als gelöst und lade die neue Version dann mal hoch.


Gesendet von iPad 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

CoolTux

Wie sieht Deine Lösung nun aus? Das was Du oben geschrieben hast oder mit Zusatz?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

andies

Genau wie oben geschrieben. Ich hatte noch X-Zeilem mit debug eingefügt und mir alles mögliche ausgeben lassen, dort aber nichts festgestellt. Senden funktioniert sofort; ich konnte nicht wirklich sehen, wieso sysread einen Fehler erzeugt. Entweder war vorher im Code was falsch oder eine Geisterhand ist im Spiel, jedenfalls geht es jetzt.
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

Maui

Moin, wie im anderen VCONTROL300 Thread schon angemerkt, nutze ich jetzt auch VClient. Und ich muss sagen, ich verstehe nicht, warum so viele VCONTROL(300) nutzen und (laut diesem Thread) kaum jemand VClient.
Chapeau, andies. Danke für dieses Modul. Es macht zwar auch nicht "mehr" als VCONTROL, aber dafür läuft es halt wenigstens stabil. Bei Vcontrol hatte ich immer meine Probleme und mal bekam ich bei manchen IDs was zurück und mal nicht.
Ich freue mich auf diesen Winter und vermutlich ein mehr an Erkenntnissen über meine Heizung.

andies

Ich habe beim virtuellen Stammtisch mal berichtet, wie ich damit einen sehr einfachen hydraulischen Abgleich gemacht habe: https://youtu.be/kLzmfkQ1u28
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

schwatter

Nabend,

mir brennen schon die Augen von allem was vor Vclient passiert ist (raspi einrichten, vcontrold einrichten,...,)
1000 Schrauben gedreht bis endlich Werte ausgespuckt wurden. An der Config von vcontrold muss ich vielleicht
auch nochmal ran. Habe passende oder halbwegs passende XML's gefunden. Danach habe ich nun die Vclient.cfg angelegt.

########################################################
#
# This file is used by the modul 89_VCLIENT.pm in FHEM
#
########################################################
## Command file for vcontrold and VCLIENT-modul in FHEM. Use the following syntax:
## vcontrold-comand FHEM-reading [daily|timer]
##
## For example the line
#
#getTempA TemperaturAuslauf
#
## will map the result of the vcontrold-Command getTempA
## to the reading TemperaturAuslauf in the VCLIENT-device.
##
## If you are dealing with timers add the word timer at the end.
## If you want to run the command only once a day add the word daily at the end.
##
########################################################

getTempA: Ermittle die Aussentemeratur in Grad C
getTempWWist: Ermittle die Warmwassertemperatur in Grad C
getTempWWsoll: Ermittle die Warmwassersolltemperatur in Grad C
setTempWWsoll: Setze die Warmwassersolltemperatur in Grad C
getTempKist: Ermittle die Kesseltemperatur in Grad C
getTempKsoll: Ermittle die Kesselsolltemperatur in Grad C
getTempVListM2: Ermittle die Vorlauftemperatur M2 in Grad C
getTempVLsollM1: Ermittle die Vorlaufsolltemperatur M1 in Grad C
getTempVLsollM2: Ermittle die Vorlaufsolltemperatur M2 in Grad C
getTempRaumNorSollM1: Ermittle die Raumsolltemperatur normal M1 in Grad C
setTempRaumNorSollM1: Setze die Raumsolltemperatur normal M1 in Grad C
getTempRaumRedSollM1: Ermittle die Raumsolltemperatur reduziert M1 in Grad C
setTempRaumRedSollM1: Setze die Raumsolltemperatur reduziert M1 in Grad C
getBrennerStatus: Ermittle den Brennerstatus
getBrennerStunden1: Ermittle die Brennerstunden Stufe 1
getPumpeStatusM1: Ermittle den Status der Pumpe M1
getPumpeStatusZirku: Ermittle den Status der Zirkulationspumpe
getBetriebArtM1: Betriebsart M1
setBetriebArtM1: Setze Betriebsart M1
getError0: Ermittle Fehlerhistory Eintrag 1
getNeigungM1: Ermittle Neigung Heizkennlinie M1
setNeigungM1: Setze Neigung Heizkennlinie M1
getNeigungM2: Ermittle Neigung Heizkennlinie M2
setNeigungM2: Setze Neigung Heizkennlinie M2
getNiveauM1: Ermittle Niveau Heizkennlinie M1
setNiveauM1: Setze Niveau Heizkennlinie M1
getNiveauM2: Ermittle Niveau Heizkennlinie M2
setNiveauM2: Setze Niveau Heizkennlinie M2
getDevType: Ermittle Device Typ der Anlage
init: Inintialisierung
get: Testabfrage, Adresse eingeben
vget: Testabfrage, Virtuelle Adresse eingeben
bget: Testabfrage, Bedienteil Adresse eingeben
pget: Testabfrage, Port Adresse eingeben
eget: Testabfrage, EEProm Adresse eingeben
xget: Testabfrage, XRAM Adresse eingeben
kmget: Testabfrage, KM-Bus EEProm Adresse eingeben
getExtBA: Ermittle Zustand der externen Betriebsartenumschaltung
getPumpeSollM1: Ermittle Solldrehzahl Pumpe M1
getVentilStatus: Ermittle Zustand Umschaltventil WW/Heizen
getHKPTyp: Ermittle Typ der Heizkreispumpe
getTempRueck: Ermittle die Ruecklauftemepratur
getTempRaumAktSoll: Ermittlen der aktuell verwendeten Raumsolltemperatur
setTempRaumAktSoll: Setzen der aktuell verwendeten Raumssolltemperatur
getPartyStatus: Ermittle Zustand Partybetrieb
getSparStatus: Ermittle Zustand Sparbetrieb
getFerienStatus: Ermittle Zustand Ferienbetrieb
getPSFByte: Ermittle Party, Spar und Ferien Statusbyte
setPSFByte: Setze Party, Spar und Ferien Statusbyte

########################################################

#getTempA Aussentemperatur
#getTempWWist Warmwassertemperatur
#getTempKist Kesseltemperatur
#getBrennerStarts Brennerstarts
#getBrennerStarts BrennerstartsBisGestern daily

#getTempRaumNorSollM1 RaumsollHaus daily
#getTempRaumRedSollM1 RaumsollHausReduz daily
#getTempRaumNorSollM2 RaumsollWohnz daily
#getTempRaumRedSollM2 RaumsollWohnzReduz daily
#getTempWWsoll WarmwasserSoll daily

#getBetriebArtM1 BetriebHaus daily
#getBetriebArtM2 BetriebWohnz daily

##Die Zahlen bei den readings sorgen fuer eine sinnvolle Anordnung der timer
#getTimerWWMo Warmwasser_1Montag manually
#getTimerWWDi Warmwasser_2Dienstag manually
#getTimerWWMi Warmwasser_3Mittwoch manually
#getTimerWWDo Warmwasser_4Donnerstag manually
#getTimerWWFr Warmwasser_5Freitag manually
#getTimerWWSa Warmwasser_6Samstag manually
#getTimerWWSo Warmwasser_7Sonntag manually

#setTempRaumNorSollM1 Tempsoll_Haus 22,21,20,19,12,8
#setTempRaumRedSollM1 Tempsoll_Haus_Reduz 22,21,20,19,12,8
#setTempRaumNorSollM2 Tempsoll_Wohnz 22,21,20,19,12,8
#setTempRaumRedSollM2 Tempsoll_Wohnz_Reduz 22,21,20,19,12,8
#setTempWWsoll Tempsoll_Warmwasser 60,15

#setTimerWWMo WW_1Mo_spaet 07:40-10:10|12:00-12:30|15:30-16:00|19:00-20:30
#setTimerWWDi WW_2Di_spaet 08:00-10:00|12:00-12:30|15:30-16:00|19:00-20:30
#setTimerWWMi WW_3Mi_spaet 06:10-10:00|12:00-12:30|15:30-16:00|19:00-20:30
#setTimerWWDo WW_4Do_spaet 08:00-10:00|12:00-12:30|15:30-16:00|19:00-20:30
#setTimerWWFr WW_5Fr_spaet 08:10-10:00|12:00-12:30|15:30-16:00|19:00-20:40
#setTimerWWSa WW_6Sa_spaet 08:00-11:00|14:00-15:00|17:00-20:30|
#setTimerWWSo WW_7So_spaet 08:00-13:10|16:00-17:00|18:50-20:30|

########################################################
#
# all available commands from my vcontrold
#
########################################################
##getTempAbgas: Ermittle die Abgastemperatur in Grad C
##getNeigungM1: Ermittle Neigung Heizkennlinie M1
##getNeigungM2: Ermittle Neigung Heizkennlinie M2
##getNiveauM1: Ermittle Niveau Heizkennlinie M1
##getNiveauM2: Ermittle Niveau Heizkennlinie M2
##setNeigungM1: Setze Neigung Heizkennlinie M1
##setNeigungM2: Setze Neigung Heizkennlinie M2
##setNiveauM1: Setze Niveau Heizkennlinie M1
##setNiveauM2: Setze Niveau Heizkennlinie M2
##getTempVListM1: Ermittle die Vorlauftemperatur M1 in Grad C
##
##getTempVListM2: Ermittle die Vorlauftemperatur M2 in Grad C
##
##getStatusStoerung: Status Sammelstoerung
##getTempA: Ermittle die Aussentemperatur in Grad C
##getTempWWist: Ermittle die Warmwassertemperatur in Grad C
##
##getTempWWsoll: Ermittle die Warmwassersolltemperatur in Grad C
##
##setTempWWsoll: Setze die Warmwassersolltemperatur in Grad C
##
##getTempStp2: Ermittle die WW Auslauftemperatur in Grad C (Tiefpass)
##
##getTempKist: Ermittle die Kesseltemperatur in Grad C
##getBetriebszeitStandby: Ermittle die NRF_BetriebszeitStandby
##getBrennerStarts: Ermittle die Brennerstarts
##getBrennerStunden1: Ermittle die Brennerstunden Stufe 1
##getTempVLsollM1: Ermittle die Vorlaufsolltemperatur M1 in Grad C
##
##getTempVLsollM2: Ermittle die Vorlaufsolltemperatur M2 in Grad C
##
##getTempRaumNorSollM1: Ermittle die Raumsolltemperatur normal M1 in Grad C
##
##setTempRaumNorSollM1: Setze die Raumsolltemperatur normal M1 in Grad C
##
##getTempRaumNorSollM2: Ermittle die Raumsolltemperatur normal M2 in Grad C
##
##setTempRaumNorSollM2: Setze die Raumsolltemperatur normal M2 in Grad C
##
##getTempRaumRedSollM1: Ermittle die Raumsolltemperatur reduziert M1 in Grad C
##
##setTempRaumRedSollM1: Setze die Raumsolltemperatur reduziert M1 in Grad C
##
##getTempRaumRedSollM2: Ermittle die Raumsolltemperatur reduziert M2 in Grad C
##
##setTempRaumRedSollM2: Setze die Raumsolltemperatur reduziert M2 in Grad C
##
##getTimerM1Mo: Schaltzeit Montag M1
##getTimerM1Di: Schaltzeit Dienstag M1
##getTimerM1Mi: Schaltzeit MIttwoch M1
##getTimerM1Do: Schaltzeit Donnerstag M1
##getTimerM1Fr: Schaltzeit Freitag M1
##getTimerM1Sa: Schaltzeit Samstag M1
##getTimerM1So: Schaltzeit Sonntag M1
##getTimerM2Mo: Schaltzeit Montag M2
##getTimerM2Di: Schaltzeit Dienstag M2
##getTimerM2Mi: Schaltzeit Mittwoch M2
##getTimerM2Do: Schaltzeit Donnerstag M2
##getTimerM2Fr: Schaltzeit Freitag M2
##getTimerM2Sa: Schaltzeit Samstag M2
##getTimerM2So: Schaltzeit Sonntag M2
##getTimerWWMo: Schaltzeit Montag Warmwasser
##getTimerWWDi: Schaltzeit Dienstag Warmwasser
##getTimerWWMi: Schaltzeit Mittwoch Warmwasser
##getTimerWWDo: Schaltzeit Donnerstag Warmwasser
##getTimerWWFr: Schaltzeit Freitag Warmwasser
##getTimerWWSa: Schaltzeit Samstag Warmwasser
##getTimerWWSo: Schaltzeit Sonntag Warmwasser
##getTimerZirkuMo: Schaltzeit Montag Zirku
##getTimerZirkuDi: Schaltzeit Dienstag Zirku
##getTimerZirkuMi: Schaltzeit Mittwoch Zirku
##getTimerZirkuDo: Schaltzeit Donnerstag Zirku
##getTimerZirkuFr: Schaltzeit Freitag Zirku
##getTimerZirkuSa: Schaltzeit Samstag Zirku
##getTimerZirkuSo: Schaltzeit Sonntag Zirku
##getBetriebArtM1: Betriebsart M1
##getBetriebArt: Betriebsart
##getBetriebArtM2: Betriebsart M2
##getBetriebSparM1: Betriebsart Spar M1
##getBetriebSparM2: Betriebsart Spar M2
##getBetriebPartyM1: Betriebsart Party M1
##getBetriebPartyM2: Betriebsart Party M2
##getTempPartyM1: Solltemperatur Partybetrieb M1
##setTempPartyM1: Setze die Warmwassersolltemperatur Party M1 in Grad C
##
##getTempPartyM2: Solltemperatur Partybetrieb M2
##setTempPartyM2: Setze die Warmwassersolltemperatur Party M2 in Grad C
##
##setBetriebPartyM1: Setze Betriebsart Party M1
##setBetriebPartyM2: Setze Betriebsart Party M2
##getStatusFrostM1: Status Frostwarnung M1
##getStatusFrostM2: Status Frostwarnung M2
##getError0: Ermittle Fehlerhistory Eintrag 1
##getError1: Ermittle Fehlerhistory Eintrag 2
##getSystemTime: Ermittle Systemzeit
##setSystemTime: Setze Systemzeit
##setTimerM1Mo: Schaltzeit Montag M1
##setTimerM1Di: Schaltzeit Dienstag M1
##setTimerM1Mi: Schaltzeit Mittwoch M1
##setTimerM1Do: Schaltzeit Donnerstag M1
##setTimerM1Fr: Schaltzeit Freitag M1
##setTimerM1Sa: Schaltzeit Samstag M1
##setTimerM1So: Schaltzeit Sonntag M1
##setTimerM2Mo: Schaltzeit Montag M2
##setTimerM2Di: Schaltzeit Dienstag M2
##setTimerM2Mi: Schaltzeit Mittwoch M2
##setTimerM2Do: Schaltzeit Donnerstag M2
##setTimerM2Fr: Schaltzeit Freitag M2
##setTimerM2Sa: Schaltzeit Samstag M2
##setTimerM2So: Schaltzeit Sonntag M2
##setTimerWWMo: Schaltzeit Montag Warmwasser
##setTimerWWDi: Schaltzeit Dienstag Warmwasser
##setTimerWWMi: Schaltzeit Mittwoch Warmwasser
##setTimerWWDo: Schaltzeit Donnerstag Warmwasser
##setTimerWWFr: Schaltzeit Freitag Warmwasser
##setTimerWWSa: Schaltzeit Samstag Warmwasser
##setTimerWWSo: Schaltzeit Sonntag Warmwasser
##setTimerZirkuMo: Schaltzeit Montag Zirku
##setTimerZirkuDi: Schaltzeit Dienstag Zirku
##setTimerZirkuMi: Schaltzeit Mittwoch Zirku
##setTimerZirkuDo: Schaltzeit Donnerstag Zirku
##setTimerZirkuFr: Schaltzeit Freitag Zirku
##setTimerZirkuSa: Schaltzeit Samstag Zirku
##setTimerZirkuSo: Schaltzeit Sonntag Zirku
##getDevType: Ermittle Device Typ der Anlage / SystemIdent_SX


Diese habe ich nach /opt/fhem/vcontrol/Vclient.cfg geschoben
Rechte für den Ordner sowie Cfg auf 644. Besitzer fhem. Gruppe dialout.
Vclient habe ich so angelegt

define vitodens222 VCLIENT 192.168.178.54 3002 /opt/fhem/vcontrol/Vclient.cfg 120

Danach geht der State nur auf closed.

Per Terminal auf meinen Fhem Pi zum Heizungs Pi klappt Telnet. Was fhelt mir jetzt noch?

Maui

Moin.
Deine cfg sieht spannend (falsch) aus.
Fang doch erstmal klein an und lösch alles und starte mit einer zeile.
getTempA getTempA

Das Format ist immer name aus der xml und anschließend name des gewünschten fhem readings. Steht aber auch im wiki und auch ein wenig im Kommentar deiner angehangegen cfg.

Gruss
Maui

schwatter

Ahhhh, danke. Bei den ganzen Configs habe ich übersehen das ich die nicht 1 zu 1 übernehmen muss.
Sonder Readings zuordnen muss  ;D