VBus in fhem

Begonnen von sweetie-pie, 15 Januar 2013, 12:27:34

Vorheriges Thema - Nächstes Thema

Tscherno

Gibt es vielleicht die Möglichkeit das Modul wieder in die Standarddistribution aufzunehmen?

mahlzeit24/7

Hallo Zusammen,

ich hab mir grad fhem 5.5 auf nem Linux Serverchen installiert, in der Hoffnung, darüber meine Deltasol ES ohne die SericeCenter Software auslesen zu können.

Leider leider kann ich den Code von Arno nicht auf dem svn finden, deshalb häng ich mich mal hier dran mit meinen Fragen:

a) ist der Code für die Integration der VBUS/LAN in FHEM noch irgendwo verfügbar?
b) läuft der auch unter 5.5?

Herzliche Grüße


mahlzeit24/7

Hallo zusammen,

habs hinbekommen.

Derzeit werden alle Temperaturen angezeit, jedoch haperts bei mir noch ein wenig mit den Pumpengeschwindigkeiten.

Zum Setup: Deltasol ES Steuerung über ein Resol VBUS/LAN Adapter und FHEM 5.5

Ich werde in den nächsten Tagen den Code noch etwas geradeziehen und dann hier posten, wer ne q'n'd version vorab haben möchte, melde sich bitte.

Herzliche Grüße

Gunther

Ich würde das Thema gerne nochmal in Angriff nehmen, nachdem ich im letzten Winter ja gescheitert bin.

Habe ebenfalls einen VBUS/LAN Adapter.

Kannst Du mir sagen, was Du gemacht hast um diesen einzubinden?
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

mahlzeit24/7

Hi, sicher doch,

ich hab die Module von Arno benutzt und angepasst, hier meine aktuelle Konfiguration:



/opt/fhem/FHEM$ cat 20_VBUS.pm
# $Id$
# VBUS Support for FHEM
# (c) Arno Willig <akw@bytefeed.de>
#
package main;

use strict;
use warnings;
use Time::HiRes qw(gettimeofday);
use IO::Socket::INET;
use IO::Select;



my %vbus_devices = (
        "1000" => "VBUS Adapter",
       "1177" => "Deltasol ES"
);


sub VBUS_Initialize($)
{
        my ($hash) = @_;
        Log 1, "VBUS_Initialize";

# Provider
        $hash->{ReadFn}  = "VBUS_Read";
        $hash->{ReadyFn} = "VBUS_Ready";
        $hash->{Clients} = ":VBUS:";

# Consumer
        $hash->{DefFn}   = "VBUS_Define";
        $hash->{UndefFn} = "VBUS_Undef";
        $hash->{GetFn}   = "VBUS_Get";
        $hash->{AttrList}= "model:vbus delay loglevel:0,1,2,3,4,5,6";
}

#####################################
sub VBUS_Define($$)
{
        my ($hash, $def) = @_;
        my $name=$hash->{NAME};
        my @a = split("[ \t][ \t]*", $def);

        Log 3, "VBUS Define: $a[0] $a[1] $a[2] $a[3] $a[4]";
        return "Define host and port as parameters" if (@a < 3);

        my $host = $a[2];
        my $port = $a[3];
        my $delay = $a[4];
        $attr{$name}{delay}=$delay if $delay;

        my $socket = IO::Socket::INET->new(PeerAddr=>$host, PeerPort=>$port, timeout=>2, blocking=>1);
        if (!$socket) {
                $hash->{STATE} = "disconnected";
                Log 1,"$name: Error opening Connection to $host";
                return "Can't Connect to $host -> $@ ( $!)\n";
        }
        $socket->close;

        $hash->{Host} = $host;
        $hash->{Port} = $port;
        $hash->{STATE} = "initialized";

        InternalTimer(gettimeofday()+10, "VBUS_GetStatus", $hash, 0);
        VBUS_GetStatus($hash);
        return undef;
}

sub VBUS_GetStatus($)
{
        my ($hash) = @_;
        my $name  = $hash->{NAME};
        my $host  = $hash->{Host};
        my $port  = $hash->{Port};
        my $delay = $attr{$name}{delay}||120;

        my $socket = IO::Socket::INET->new(PeerAddr=>$host, PeerPort=>$port, timeout=>2, blocking=>1);
        if (!$socket) {
                $hash->{STATE} = "disconnected";
                Log 1,"$name: Error opening Connection to $host";
                return;
        }

        # +HELLO
        $socket->autoflush(1);
        $socket->getline();
        $socket->write("PASS fokker\n");
        $socket->getline();
        $socket->write("DATA\n");
        $socket->getline();

        my $idx;
        my $protoVersion="0";
        my $dst_addr;
        my $src_addr;
        my $command;
        my $frameCount;
        my $checksum;
        my $line = "";

        for (my $i=0;$i<3 && $protoVersion!="10";$i++) {
                # Find beginning
                $idx=-1;
                while ($idx<0) {
#                       Log 3,"$name: Try $i Find beginning";
                        $line .= $socket->getline();
                        $idx = index($line,chr(hex("aa")));
                }
                $line = substr($line,$idx); ## if ($idx>0);

                # Find end
                $idx=-1;
                while ($idx<0) {
                        my $hahn = unpack('H*',$line);
#                       Log 3,"$name: Try $i Find end $hahn";
                        $line .= $socket->getline();
                        $idx = index($line,chr(hex("aa")),1)
                }

                $dst_addr = unpack('H*',substr($line,1,2)); # byte order
                $src_addr = unpack('H*',substr($line,3,2)); # byte order
                $protoVersion = unpack('H*',substr($line,5,1));
                $command = unpack('H*',substr($line,6,2)); # byte order
                $frameCount = ord(substr($line,8,1));
                $checksum = ord(substr($line,9,1));
                Log 5,"$name: Src: $src_addr Dst: $dst_addr Proto: $protoVersion CMD: $command FC: $frameCount CRC: $checksum";
                $line = substr($line,1);
        }
        $line = chr(hex("aa")).$line;
        $line = substr($line,0,$idx);
        $socket->close();

        my $devtype = $vbus_devices{$src_addr};  # TODO OR "Unknown: ".$src_addr
        if ($protoVersion != "10") {
                return;
        }

        my $payload = "";
        for (my $i = 0; $i < $frameCount; $i++) {
                my $septett  = ord(substr($line,10+$i*6+4,1));
                my $checksum = ord(substr($line,10+$i*6+5,1));
                my $crc = (0x7f - $septett) & 0x7f;
                for (my $j = 0; $j<4;$j++) {
                        my $ch = ord(substr($line,10+$i*6+$j,1));
                        $ch |= 0x80 if ($septett & (1 << $j));
                        $crc = ($crc - $ch) & 0x7f;
                        $payload .= chr($ch);
                }
                if ($crc != $checksum) {
                        Log 3,"$name: Checksum failed!";
                        return;
                }
        }
        my $tm = TimeNow();
        $hash->{READINGS}{"DEVTYPE"}{TIME} = $tm;
        $hash->{READINGS}{"DEVTYPE"}{VAL} = $devtype;

# TODO Je nach Device (5177 fuer Diemasol C) die richtigen Bytes abgreifen
#
        my $i = 0;
        my $temp_collector = (ord(substr($payload,1,1))*256 + ord(substr($payload,0,1))) / 10.;
        my $temp_storage = (ord(substr($payload,3,1))*256 + ord(substr($payload,2,1))) / 10.;
        my $temp_freshwater = (ord(substr($payload,5,1))*256 + ord(substr($payload,4,1))) / 10.;
        my $temp_heating = (ord(substr($payload,11,1))*256 + ord(substr($payload,10,1))) / 10.;
        my $pump_throughput = (ord(substr($payload,23,1))*256 + ord(substr($payload,22,1))) / 1.;
        my $vent_storage = (ord(substr($payload,23,1)) & (0x02) !=0) ? 1 : 0;
        my $vent_heating = (ord(substr($payload,23,1)) & (0x20) !=0) ? 1 : 0;

        my $val = "T1: ".$temp_collector." T2: ".$temp_storage." T3: ".$temp_freshwater." T4: ".$temp_heating." V1: ".$pump_throughput;

        $hash->{STATE} = $val;                      # List overview
        $hash->{READINGS}{state}{TIME} = $tm;       # For list
        $hash->{READINGS}{state}{VAL} = $val;
        $hash->{CHANGED}[$i++] = $val;                 # For notify
#       Log GetLogLevel($name,3), "$name: VBUS \"$devtype\" $val";

        Log 4,"$name: COLLECTOR:    $temp_collector (Celsius)";
        Log 4,"$name: STORAGE:      $temp_storage (Celsius)";
        Log 4,"$name: FRESHWATER:   $temp_freshwater (Celsius)";
        Log 4,"$name: HEATING:      $temp_heating (Celsius)";
        Log 4,"$name: THROUGHPUT:   $pump_throughput (l/min)";
        Log 4,"$name: VENT_STORAGE: $pump_throughput (Umin";
        Log 4,"$name: VENT_HEATING: $vent_heating";

        DoTrigger($name, undef);
        InternalTimer(gettimeofday()+$delay, "VBUS_GetStatus", $hash, 0);
}

#####################################
sub VBUS_Undef($$)
{
        Log 3,"****** VBUS_Undef";
        my ($hash, $name) = @_;
        RemoveInternalTimer($name);
        return undef;
}

1;


DArin legst Du halt fest, welche Steuerung du hast und welche Septette daraus ausgelesen werden.

Da hilft dann nur die vbus spezifikation und anpassen, ist aber nicht sooo schwierig. Meine Anlage ist ne DEltasol ES und beim Auswerten siehst du die entsprechenden Einträge.
In der sub-Prozedur VBUS_GetStatus siehst du bei socket->write ("PASS fokker\n");

statt fokker gibst du dein passwort für den lan adapter an, also jenes Passwort dass du auch im Servicecenter benutzt.

dann noch folgenen Eintrag in die fhem.cfg

# VBUS Resol Addition

define myVBUSDevice VBUS 192.168.2.19 7053 600
attr myVBUSDevice delay 600
attr myVBUSDevice fp_Keller 50,250,0,
attr myVBUSDevice fp_Plotspage 50,500,0,
attr myVBUSDevice fp_Temperaturen 307,482,1,Regler Werte
attr myVBUSDevice room HMS

define FileLog_myVBUSDevice FileLog /opt/fhem/log/myVBUSDevice-%Y.log myVBUSDevice
attr FileLog_myVBUSDevice logtype vbus,text
attr FileLog_myVBUSDevice room logs


erste und zweite zeile ist das delay angeben, in sekunden, am anfang ist evtl 60 besser statt 600 dann siehst du häufiger was reinkommt.

am besten ein tail -f auf das logfile myVBUSDevice-2013.log und ein weiteres fenster mit nem tail -f auf das fhem log file dann sollte alles glatt gehen.

Viel ERfolg


mahlzeit24/7

So,

nachdem ich einige Probleme mit dem "alten" Modul hatte und nicht nur damit, hab ich mich zur Radikalkur entschieden:

HW: HP Data Vault X300
SW: Ubuntu Server 13.04 64bit auf SD Karte (lief vorher über USB Stick mit Debian Wheezy 32 bit)

FHEM 5.5

Auszug für vbus aus der fhem conf:

attr global userattr DbLogExclude devStateIcon devStateStyle fp_Keller fp_Plotspage fp_Temperaturen fp_solar icon sortby webCmd

# VBUS Resol Addition

define myVBUSDevice VBUS 192.168.2.19 7053 900
attr myVBUSDevice delay 900
attr myVBUSDevice fp_Keller 50,250,0,
attr myVBUSDevice fp_Plotspage 50,500,0,
attr myVBUSDevice fp_Temperaturen 307,482,1,Regler Werte
attr myVBUSDevice room HMS

define FileLog_myVBUSDevice FileLog ./log/myVBUSDevice-%Y.log myVBUSDevice
attr FileLog_myVBUSDevice logtype vbus,text
attr FileLog_myVBUSDevice room logs

dazu die angehängte 20_VBUS.pm erstellt für Deltasol ES

Ergibt dann (endlich ) schöne readings wie im Screenshot

Herzliche Grüße

Frank

danni-k

Hallo,

erstmal Respekt für die bisherige Arbeit für das Forum !

Aktuell versuche ich eine Vitosolic 200 per Resol VBUS/LAN-Adapter in FHEM zu integrieren.
Mit dem Modul von Arno kann ich zwar "etwas" auslesen, allerdings erscheint bei Offset 0 die T10. Sollte aber ja die T1 sein.
Ab und zu bekomme ich aber einen korrekten Wert von T1 bei Offset 0. Die Zahlenwerte scheinen aber zu passen, am Format liegt es also nicht.

Als Device-Nr. hab ich die 7321 eingetragen.

Muss ich hier noch was ändern:
        my $devtype = $vbus_devices{$src_addr};  # TODO OR "Unknown: ".$src_addr


Wenn ja, was?
Oder hab ich was vergessen ?

Bin für jeden Tip dankbar !

Grüsse,
   danni-k

PS: Hab auch schon das Modul von Frank versucht, allerdings erscheinen hier nicht die richtigen Zahlenwerte.

mahlzeit24/7

Hi,

ich vermute, du greifst nicht nach den richtigen streams.

kuck mal in die 20_VBUS.pm

da gibts 2 Zeilen, die erste

for ($i=0;$i<3 && ($protoVersion!="10"||$dst_addr!="1000"||$src_addr!="1174");$i++) {
                # Find beginning
                $idx=-1;
                while ($idx<0) {
                #Log 3,"$name: Try $i Find beginning";
                        $line .= $socket->getline();
                        $idx = index($line,chr(hex("aa")));
                }
bei der 1174 musst Du die diemasol eintragen, wie bei mir, also die 2 ersten zahlen an letzer stelle.

Da kommt wenig später nochmal, dann solltest du die richtigen streams verarbeiten können

Viele Grüße

Frank

danni-k

Hallo,

und herzlichen Dank an Frank !

Mit der "verkehrten" Byteorder klappt es nun endlich.

Dann werd ich mal die Logs beobachten und parallel mich mit den Plots für die Vitosolic 200 beschäftigen.

Gruß,
   danni-k

Gunther

Jungs, Ihr seid die Besten!

Frank, vielen Dank für Deine Ausführungen!
Ich habe meine Vitosolic nun auch so drin, dass ich schonmal Werte bekomme. Ich muss derzeit noch wild rumklicken um den Plot zu sehen, aber es geht schonmal! Danke!!!

Gruß
Gunther
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

mahlzeit24/7

Hallo Gunther, Danni-k,

gerne doch. ich habe ab und an ausreisser in meinen messwerten, sprich temperaturen um die -3000 Grad und so.

Mich stört es momentan nicht so sehr, werde aber sicher da nochmal beigehen, wenn ich mehr zeit habe.

Um den Plot zu erstellen musst du eigentlich nur in "everything" das logfile finden und dann auf "vbus" klicken, dann steht unter dem Plot "create svg instance" damit kannst du den plot dauerhaft anlegen.

Herzliche Grüße

Frank

Gunther

Ja, die Ausreisser habe ich auch. Die machen den Plot natürlich auf großer Ebene unlesbar.

Folgende Zeilen habe ich nicht genutzt, da ich 1. nicht weiß, wofür diese sind und 2. dadurch bei mir Fehlermeldungen erzeugt werden. Kannst Du dazu noch etwas sagen?
attr global userattr DbLogExclude devStateIcon devStateStyle fp_Keller fp_Plotspage fp_Temperaturen fp_solar icon sortby webCmd

attr myVBUSDevice fp_Keller 50,250,0,
attr myVBUSDevice fp_Plotspage 50,500,0,
attr myVBUSDevice fp_Temperaturen 307,482,1,Regler Werte
attr myVBUSDevice room HMS


Leider habe ich eben alles deinstalliert:
1. beide Dateien aus FHEM gelöscht
2. in der fhem.cfg auskommentiert

Warum? Mein Netzwerk ist so enorm in die Knie gegangen, dass ich nicht mehr richtig auf mein NAS zugreifen kann und Streaming von der Enigma2-Box unmöglich geworden ist.
Ich hatte in der Urversion ja viel mehr Probleme (alles war tot). Bin ja froh, dass es theoretisch funktioniert.

Habt Ihr die Probleme auch?
Ich nutze für FHEM eine FB7390.
Über Hinweise, Ideen und mögliche Performanceoptimierungen bin ich dankbar.

Viele Grüße
Gunther
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

mahlzeit24/7

Hallo Gunther,

das ist natürlich schade, dass dein netzwerk damit in die knie geht.....

zu deinen Fragen:

attr myVBUSDevice fp_Keller 50,250,0,                                                - ich hab die Temperaturen in Floorplan, wenn Du kein Floorplan nutzt, brauchst Du keine Zeile mit fp
attr myVBUSDevice fp_Plotspage 50,500,0,
attr myVBUSDevice fp_Temperaturen 307,482,1,Regler Werte
attr myVBUSDevice room HMS                                                              -müßte klar sein

was mit einfällt, wäre evtl mit dem delay rumzuexperimentieren:

define myVBUSDevice VBUS 192.168.2.19 7053 1200
attr myVBUSDevice delay 1200

die 1200 sind die sekunden bis zum nächsten Abruf, also 20 minuten

Was auch ne Möglichkeit wäre, dass ja ein neuer Prozess pro Abruf geforkt wird.

Leider habe ich keine FB zum Testen - ich mache das von meinem NAS aus, auf dem eh ein Linux läuft......

Wenn Du ne Konsolensession (ssh, oder vglb) auf die FB hinbekommst, würde ich 3 Dinge mal versuchen wollen:

1. Fenster: tail -f /var/log/syslog (gibt es bei der FB ein Syslog überhaupt?)
2. Fenster ein "top" laufen lassen
3. Fenster vbus wieder einschalten und ggf ein tail auf das vbuslog

wenn sich da direkte zusammenhänge ergeben, wäre es prima, die Stelle zu lokalisieren an denen sie auftreten, also ggf loglevel auf 5 stellen und genau beobachten.

Alternative bleibt natürlich, ab und an mit dem Servicecenter drauf zu lauschen

Herzliche GRüße

Frank

limats

Hallo zusammen,

erstmal vielen Dank für das Modul. Habe es an meine Deltasol BX angepasst und es schnurrt einwandfrei.
Da auch mir die Ausreißer regemläßig meine Plots zerstört haben, hab ich mal ein bisschen analysiert und das Problem gefunden:
Wenn der Payload einen Zeilenumbruch enthält, klappt die Übergabe des Payloads an die Auswertefunktion nicht (steht auch so im Wiki).
Ich hab deshalb bei mir einfach den Code so geändert, dass der Payload nicht als Binärstring sondern im Hexformat zurückgegeben wird.
Umgewandelt wurde er ja zu Loggingzwecken bereits.

Bis jetzt habe ich seit der Änderung keine Fehler mehr.

Gruß
Leo
Fhem auf BBB:
HM-CFG-USB für div. HM-Sensoren, CUL+WMBUS für EnergyCam, Nanocul für IT, Arduino Mega 2560 als 1-wire-Gateway und für div. digitale Ein-/Ausgänge, Volkszähler-USB-IR-Lesekopf mit SMLUSB, Solarsteuerung über VBUS

mahlzeit24/7

Hi Leo,

das klingt schlüssig!

Kannst Du dann evtl deine 20_VBUS.pm hier an den thread hängen? Somit wäre allen am schnellsten geholfen.

Super, Danke Dir

Frank