Heizungssteuerung mit VCLIENT (Version 0.2.11f)

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

Vorheriges Thema - Nächstes Thema

CoolTux

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

#16
CoolTux, ich brauche nochmal Deine Hilfe. Ich habe versucht, alle Details aus VCLIENT_Test in meine Datei hinüberzunehmen (Datei hängt unten an). Mit Verbose 5 kann ich verfolgen, was alles passiert. Ich habe folgende Situation:
2017.10.19 17:43:17 5: Viessmann: execute get command Viessmann ?
2017.10.19 17:43:18 5: Viessmann: execute get command Viessmann update
2017.10.19 17:43:18 5: Viessmann: will now update readings
2017.10.19 17:43:18 5: Viessmann: Opening vcontrold connection to 192.168.2.105:3002
2017.10.19 17:43:18 5: Viessmann: vcontrold opened
2017.10.19 17:43:18 5: Viessmann: Requesting getBrennerStarts
2017.10.19 17:46:42 3: sduino IT_set: Steckdose_A on #also ein anderer Befehl, drei Minuten später - dazwischen nichts

und das heißt, er schickt das Kommando getBrennerStarts an Viessmann. Macht man das mit telnet, so erhält man etwa eine Sekunde später die Antwort. Hier ist es nun so, dass die Antwort von VCLIENT_Read abgefangen werden müsste, wenn ich das richtig verstanden habe. Aber VCLIENT_Read wird nicht aufgerufen (ich müsste sonst einen Log-Eintrag sehen, auch wenn da überhaupt nichts ankommt). Hast Du eine Idee, wieso das nicht geht?

<edit> Nochmal telnet (bitte die Einheit ignorieren):
$ telnet 192.168.2.105 3002
Trying 192.168.2.105...
Connected to raspheizung.fritz.box.
Escape character is '^]'.
vctrld>getBrennerStarts
165092.000000 Grad
vctrld>quit
good bye!
Connection closed by foreign host
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

Schaue ich mir nachher an. Dauert kleinen Moment.
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

#18
Super, danke. Und ich weiß, dass das alles ehrenamtlich ist, also lass Dir Zeit.

<EDIT> Ich habe eine Idee. Es gibt eine Stelle, die ich nicht verstanden habe und anders behandelte. Nach der Definition einiger Routinen bei Dir stand da
my $hash = shift;
und ich habe das ersetzt durch
    my ($hash) = @_;
Das wird es vermutlich sein, ich muss nur gleich weg und kann das nicht testen...
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

Du musst die Read und WriteFn doch noch entsprechend benennen.

$hash->{ReadFn}     = "Modulname_Read";
$hash->{WriteFn}    = "Modulname_Write";

Oder halt anders nennen. Aber das muss in die Initialize Funktion.
Es fehlt bei Dir auch noch die ganze Write Funktion
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

Danke, das war's. Jetzt liest er und ich muss noch kontrollieren, was da ankommt.
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

#21
Mist, das war es leider nicht; ich muss nochmal nerven. Ich habe das inzwischen alles repariert, die Parameter genau so eingelesen wie in https://wiki.fhem.de/wiki/DevelopmentModuleIntro#X_Initialize etc beschrieben und auch die Read- und Write-Funktion gesetzt. Ich empfange auch etwas, aber eben nicht das Ergebnis. Derzeit mache ich es so (siehe Anhang), dass bei einem Empfang von vctrld> die Funktion VCLIENT_Read einfach "return" zurückgibt und damit wartet, ob es nochmal einen Rückmeldung gibt, weil sie ja dann erneut aufgerufen wird. (Es ist doch so, dass ich bei einem return innerhalb einer if-then-else-Abfrage die gesamte sub verlasse, oder?)

Diese kommt aber ärgerlicherweise nicht. Kann es sein, dass $buf zu klein ist? Aber 1024 müssten alle mal reichen?! So sieht der verbose 5-Log aus:

2017.10.19 22:17:55 5: Viessmann: execute get command Viessmann ?
2017.10.19 22:17:58 5: Viessmann: execute get command Viessmann update
2017.10.19 22:17:58 5: Viessmann: will now update readings
2017.10.19 22:17:58 5: Viessmann: Opening vcontrold connection to 192.168.2.105:3002
2017.10.19 22:17:58 5: Viessmann: vcontrold opened
2017.10.19 22:17:58 5: Viessmann: line = 7
2017.10.19 22:17:58 5: Viessmann: buf = vctrld>                        #habe ich mir ausgeben lassen
2017.10.19 22:17:58 5: Viessmann: received only prompt vctrld>  #es wird erkannt, dass nur der Prompt ausgegeben wird
2017.10.19 22:17:58 5: Viessmann: Requesting getTempA            #hier kommt erst der request
2017.10.19 22:18:22 5: Viessmann: execute get command Viessmann ? # und wieso passiert jetzt nichts? Kein Read aufgerufen?
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

Guten Morgen,

Ich trage erstmal zusammen


sub VCLIENT_Write($$)
{
       my ( $hash, $message, $address) = @_;

Deiner Sub darfst Du max 2 Scalare übergeben. Innerhalb der Sub möchtest Du aber 2 auslesen. Das passt nicht. Übergib entweder $ Scalare oder ein Scalar und ein Array.


InternalTimer(gettimeofday()+ $my_internal_timer, "VCLIENT_Write", $hash, 1);

Du rufst die Write Funktion mit InternalTimer auf, dadurch verzögert. Ich weiß jetzt nicht wie hoch die Verzögerung ist. Und die 1 hinten am besten ganz weg nehmen. Die ist absolet. Also mit Komma davor weg.

Dann bau mal mehr Logausgaben ein. Nicht nur innerhalb von Abfragen sondern auch direkt nach dem auslesen.

Dann schaue einmal Deinen Subs. Was und wie viel übergibst Du und was liest Du davon ein. Da ist viel zu viel.

Und ganz wichtig, bitte niemals $hash->{STATE} beschreiben. Das wird vom Reading state gemacht. Also bitte nur das Reading state füllen.

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

Vielen, vielen Dank CoolTux: Es lag daran, dass ich beim Senden vergessen hatte am Ende ein "\r\n" zu setzen. Peinlich. Jetzt läuft alles. Ich habe da eine ganze Menge gelernt und vor allem die Angst vor der Modulprogrammierung verloren! Das war eine tolle Erfahrung.

Ich werde heute oder morgen (ich will länger testen) eine neue Version in den ersten Eintrag hier im Thread hochladen und entsprechend editieren. Danach setze ich mich mal an die set- und timer-Sachen. Wenn es noch zwei Leute hier im Forum gibt, die überlegen das Modul einzusetzen, dann würde ich mir noch mit einem Wikieintrag Mühe geben und überlegen es offiziell einzuchecken. Für mich alleine lohnt sich der Aufwand nicht. Also bitte melden, wenn es diese zwei Personen gibt; ich helfe auch gern beim einrichten.
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

#24
So, set- und timer-Befehle gehen. Betriebsart kann ich noch nicht setzen, aber Temperaturen schon. Alles weitere im device specific help sowie dem allerersten Eintrag.

<edit> Nur zur Info: Die täglichen Brennerstarts erfasse ich (gegeben die genannte cfg-Datei) mit
attr <name> userReadings BrennerstartsNurGestern difference { ReadingsVal($name,"BrennerstartsBisGestern",0);;;; }
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

#25
Ich kann nun endlich auch set-Befehle und insbesondere timer-Befehle für Heizung und Warmwasser senden. Das war ziemlich nervig, weil die Webseite openv (die ja kurz vor dem Abschalten steht) wirklich furchtbar ist. Man findet nichts, die Wikis sind nicht gepflegt und durchsetzt von Foren, bei denen es aber keine Antworten gibt, die Software ist nicht dokumentiert usw usf. Da merkt man mal, was für ein Glück es ist, dieses Forum zu haben.

Es kommt noch etwas hinzu. Timer werden zB so gesetzt:
setTimerWWMo 07:40 10:10 12:00 12:30 15:30 16:00 19:00 20:30
aber, und jetzt kommt es, ergibt das auch bei erfolgreicher Ausführung eine Fehlermeldung seitens vcontrold:
ERR: >FRAMER: addr was still active FE06
>FRAMER: Command send
>FRAMER: unexpected length 8 08
Fehler recv, Abbruch
Fehler beim ausfuehren von setTimerWWMo 07:40 10:10 12:00 12:30 15:30 16:00 19:00 20:40

Das scheint ein bug zu sein, den ich aber nicht reparieren kann. Da das Kommando durchgeht, reicht mir das. Alles weitere im ersten Post sowie device-specific-help.

Ich habe durch die Version, die jetzt oben liegt, gemerkt, dass ich langsam aber sicher an meine Programmiergrenzen in Perl stoße. Gerade die Übergabe von Parametern oder Syntaxprüfungen mit RegEx gehen zwar irgendwie, aber ich muss mir die Sachen aus anderen Programmen kopieren, weil ich keine rechten Ideen habe, wie das so geht. Also vermutlich wird bald hier Schluss sein. Zumal ich habe, was ich brauche.
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

Version 0.2.7, damit auch so etwas in der config-Datei geht:
setTimerWWMo WW_21Mo_aus 06:00-06:10|||
setTimerWWDi WW_22Di_aus 06:00-06:10|||
setTimerWWMi WW_23Mi_aus 06:00-06:10|||
setTimerWWDo WW_24Do_aus 06:00-06:10|||
setTimerWWFr WW_25Fr_aus 06:00-06:10|||
setTimerWWSa WW_26Sa_aus 06:00-06:10|||
setTimerWWSo WW_27So_aus 06:00-06:10|||

setTimerWWMo WW_11Mo_frueh 06:00-09:10|12:00-12:30|15:30-16:00|19:00-20:30
setTimerWWDi WW_12Di_frueh 06:00-09:00|12:00-12:30|15:30-16:00|19:00-20:30
setTimerWWMi WW_13Mi_frueh 06:00-09:00|12:00-12:30|15:30-16:00|19:00-20:30
setTimerWWDo WW_14Do_frueh 06:00-09:00|12:00-12:30|15:30-16:00|19:00-20:30
setTimerWWFr WW_15Fr_frueh 06:00-09:00|12:00-12:30|15:30-16:00|19:00-20:40
setTimerWWSa WW_16Sa_frueh 08:10-11:00|14:00-15:00|17:00-20:30|
setTimerWWSo WW_17So_frueh 08:10-13:10|16:00-17:00|18:50-20:30|
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

#27
Ich beschreibe mal, zu welcher Lösung ich nun vorläufig endgültig gekommen bin. Ich hatte zuerst versucht, noch ein DOIF zu erstellen, so dass der Ferienbetrieb (also das Setzen der Wassertemperatur, der Raumtemperaturen und der Heizzeiten) in einem Befehl erfolgt. Das geht leider nicht, weil schon beim Setzen der Wassertemperatur vcontrold einen Fehler meldet und die Bearbeitung dann unterbrochen bzw abgebrochen wird. Da ich die Wassertemperatur nicht mehrfach täglich setzen möchte, lässt sich das verschmerzen.

Ich nehme derzeit folgende Vclient.cfg:
getTempA Aussentemperatur
getTempWWist Warmwassertemperatur
getTempKist Kesseltemperatur
getBrennerStarts Brennerstarts
getBrennerStarts BrennerstartsBisGestern daily

getTempRaumNorSollM1 RaumsollHaus manually
getTempRaumRedSollM1 RaumsollHausRed manually
getTempRaumNorSollM2 RaumsollWohnz manually
getTempRaumRedSollM2 RaumsollWohnzRed manually
getTempWWsoll WarmwasserSoll manually

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

getTimerFerienBeginn Ferienbeginn manually
getTimerFerienEnde Ferienende manually

setTempRaumNorSollM1 Haus_Soll 22,21,20,19,10
setTempRaumRedSollM1 Haus_Soll_Red 22,21,20,19,10
setTempRaumNorSollM2 Wohnz_Soll 22,21,20,19,10
setTempRaumRedSollM2 Wohnz_Soll_Red 22,21,20,19,10
setTempWWsoll WW_Soll 60,10

setTimerWWMo WW_11Mo_frueh 06:00-09:10|12:00-12:30|15:30-16:00|19:00-20:30
setTimerWWDi WW_12Di_frueh 06:00-09:00|12:00-12:30|15:30-16:00|19:00-20:30
setTimerWWMi WW_13Mi_frueh 06:00-09:00|12:00-12:30|15:30-16:00|19:00-20:30
setTimerWWDo WW_14Do_frueh 06:00-09:00|12:00-12:30|15:30-16:00|19:00-20:30
setTimerWWFr WW_15Fr_frueh 06:00-09:00|12:00-12:30|15:30-16:00|19:00-20:40
setTimerWWSa WW_16Sa_frueh 08:10-11:00|14:00-15:00|17:00-20:30|
setTimerWWSo WW_17So_frueh 08:10-13:10|16:00-17:00|18:50-20:30|

setTimerWWMo WW_21Mo_spaet 08:00-10:10|12:00-12:30|15:30-16:00|19:00-20:30
setTimerWWDi WW_22Di_spaet 08:00-10:00|12:00-12:30|15:30-16:00|19:00-20:30
setTimerWWMi WW_23Mi_spaet 06:10-10:00|12:00-12:30|15:30-16:00|19:00-20:30
setTimerWWDo WW_24Do_spaet 08:00-10:00|12:00-12:30|15:30-16:00|19:00-20:30
setTimerWWFr WW_25Fr_spaet 08:00-10:00|12:00-12:30|15:30-16:00|19:00-20:40
setTimerWWSa WW_26Sa_spaet 08:10-11:00|14:00-15:00|17:00-20:30|
setTimerWWSo WW_27So_spaet 08:10-13:10|16:00-17:00|18:50-20:30|
 
Damit werden die wichtigen Daten regelmäßig ausgelesen, der Rest (wie Solltemperaturen) nur bei Bedarf. In dem device kann ich dann händisch die Warmwasserzeiten setzen (sieben mal klicken), das klappt auch (weil ich danach die geänderten Daten manuell abrufe und ich sie unten an der Heizung nochmal kontrolliert habe). Das mache ich immer dann, wenn Schulferien beginnen oder enden.

Ebenso gehe ich mit den Raumtemperaturen um (vier Klicks). Die ändere ich, wenn ich länger, also für mehrere Tage, das Haus verlasse. Die Lösung läuft jetzt, in den nächsten Tagen sind wir mal für wenige Tage außer Haus, da teste ich das mal aus der Ferne und nicht im selben Netz. Aber das sollte genau so gehen wie gerade eben. Ich hoffe mal, ich kann jetzt das Basteln an der Lösung beenden; bin schon süchtig geworden.
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

#28
Also mit brachialer Gewalt kriegt man den Fehler, dass timer nicht gesetzt werden können, auch in den Griff. Da ich alle Kommandos überprüft habe, ist das bei mir ok. Wer das nachmacht sollte sich sicher sein, was er/sie hier tut.

Ich habe in framer.c beim Quellcode von vcontrold (zum Beispiel https://github.com/c4rd0n/vcontrold/ oder https://github.com/openv/openv/) in Zeile 442 die Abfrage geändert. Da ist nämlich der Fehler. Wie er zustande kommt, weiß ich nicht. Ich weiß nur, dass zwei Längen verglichen werden und weil sie nicht gleich sind, wird angehalten. Der Vergleich ist fehlerhaft, weil der LEADIN für ein separates Kommando gehalten wird und so alles aus dem Tritt kommt. Schreibt man die Zeile wie folgt
if ((r_len != l_buf[P300_RESP_LEN_OFFSET]) && (l_buf[P300_RESP_LEN_OFFSET] != 8))
und neu ist dabei der Teil nach &&, dann gibt es keine Fehlermeldungen mehr und die Sache geht auch korrekt durch (nur timer haben ein l_buf[P300_RESP_LEN_OFFSET] von acht, sonst kommt das nicht vor). Aber wohler würde ich mich fühlen, wenn die Autoren des Codes sich dem mal annehmen würden. (Die originale vcontrold-Seite ist, wie vielleicht bekannt, gnadenlos verwaist und wird in drei Wochen wohl geschlossen.)
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, am Anfang war das ja alles Spaß mit dem Löten und FHEM und so (und mehrere Freunde haben sich bei meinen Schilderungen an den Kopf gegriffen). Jetzt stellt sich ein nie beabsichtigter Nebeneffekt ein. Ich habe festgestellt, dass ich vor einigen Tagen 120 Brennerstarts pro Tag hatte (konnte ich ja früher nie bequem messen). Außerdem habe ich gesehen, dass das Wasser im Kessel permanent über 50 Grad warm ist - eigentlich ja schön, nur wenn hier nur morgens geduscht und abends bestenfalls Zähne geputzt werden?! Also habe ich angefangen, in Viessmann-Foren zu surfen, konnte aufgrund des Moduls mit vielen Details mitreden und Fragen stellen und musste feststellen, dass meine Anlage von meinem Heizungsbauer anscheinend reichlich falsch eingestellt wurde. Ohne die Zugriffe per FHEM wäre mir das nicht aufgefallen, es ist warm und alles scheinbar bestens.

Mal sehen, was alles noch passiert, wenn ich weiter irgendwo irgendwelche Sensoren einstelle. Langsam wird mir klar, wieso smart home eine wirklich tolle Sache ist. Man muss nur eine Menge Handarbeit investieren, und nicht die Fertigtools, die nicht miteinander kommunizieren können und Insellösungen darstellen.
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