diff --git a/contrib/19_VBUSIF.pm b/contrib/19_VBUSIF.pm new file mode 100644 index 000000000..216a681df --- /dev/null +++ b/contrib/19_VBUSIF.pm @@ -0,0 +1,259 @@ +# 19_VBUSIF.pm +# VBUS LAN Adapter Device +# +# (c) 2014 Arno Willig +# (c) 2015 Frank Wurdinger +# (c) 2015 Adrian Freihofer + +package main; + +use strict; +use warnings; +use POSIX; +use Data::Dumper; +use Device::SerialPort; + +sub VBUSIF_Read($@); +sub VBUSIF_Write($$$); +sub VBUSIF_Ready($); + +sub VBUSIF_getDevList($$); + + +sub VBUSIF_Initialize($) +{ + my ($hash) = @_; + require "$attr{global}{modpath}/FHEM/DevIo.pm"; + +# Provider + $hash->{ReadFn} = "VBUSIF_Read"; + $hash->{WriteFn} = "VBUSIF_Write"; + $hash->{ReadyFn} = "VBUSIF_Ready"; + $hash->{UndefFn} = "VBUSIF_Undef"; + $hash->{ShutdownFn} = "VBUSIF_Undef"; + +# Normal devices + $hash->{DefFn} = "VBUSIF_Define"; + $hash->{AttrList} = "dummy:1,0"; +} + + +sub VBUSIF_Define($$) +{ + my ($hash, $def) = @_; + my @a = split("[ \t]+", $def); + + if(@a != 3) { + return "wrong syntax: define VBUSIF [ or ]"; + } + + my $name = $a[0]; + my $dev = $a[2]; + $hash->{Clients} = ":VBUSDEV:"; + my %matchList = ( "1:VBUSDEV" => ".*" ); + $hash->{MatchList} = \%matchList; + + DevIo_CloseDev($hash); + $hash->{DeviceName} = $dev; + my @dev_name = split('@', $dev); + if ( -c ${dev_name}[0]) { + $hash->{DeviceType} = "Serial"; + } else { + $hash->{DeviceType} = "Net"; + } + + my $ret = DevIo_OpenDev($hash, 0, "VBUSIF_DoInit"); + return $ret; +} + +sub VBUSIF_DoInit($) +{ + my $hash = shift; + if ($hash->{DeviceType} eq "Net" ) { + my $name = $hash->{NAME}; + delete $hash->{HANDLE}; # else reregister fails / RELEASE is deadly + + my $conn = $hash->{TCPDev}; + $conn->autoflush(1); + $conn->getline(); + $conn->write("PASS vbus\n"); +# $conn->write("PASS !Cs536939$\n"); + $conn->getline(); + $conn->write("DATA\n"); + $conn->getline(); + } + return undef; +} + +sub VBUSIF_Undef($@) +{ + my ($hash, $arg) = @_; + if ($hash->{DeviceType} eq "Net" ) { + VBUSIF_Write($hash, "QUIT\n", ""); # RELEASE + } + DevIo_CloseDev($hash); + return undef; +} + +sub VBUSIF_Write($$$) +{ + my ($hash,$fn,$msg) = @_; + DevIo_SimpleWrite($hash, $msg, 1); +} + + +sub VBUSIF_Read($@) +{ + my ($hash, $local, $regexp) = @_; + my $buf = ($local ? $local : DevIo_SimpleRead($hash)); + return "" if(!defined($buf)); + my $name = $hash->{NAME}; + $buf = unpack('H*', $buf); + my $data = ($hash->{PARTIAL} ? $hash->{PARTIAL} : ""); + + Log3 $hash->{NAME}, 5, ,"received buffer: $buf"; + + $data .= $buf; + + my $msg; + my $idx; + $idx = index($data,"aa"); + if ($idx>=0) { + + $data = substr($data,$idx); # Cut off beginning + + $idx = index($data,"aa",2); # Find next message + + if ($idx>0) { + + $idx +=1 if (substr($data,$idx,3) eq "aaa"); # Message endet mit a + + $msg = substr($data,0,$idx); # vollstaendiges Payload + $data = substr($data,$idx); # erster Teil des naechsten Payloads + Log3 $hash->{NAME}, 4, ,"completed Message: $msg"; + + my $protoVersion = substr($msg,10,2); + + if ($protoVersion == "10" && length($msg)>=20) { + my $frameCount = hex(substr($msg,16,2)); + my $headerCRC = hex(substr($msg,18,2)); + + my $crc = 0; + for (my $j = 1; $j<=8;$j++) { + $crc += hex(substr($msg,$j*2,2)); + } + $crc = ($crc ^ 0xff) & 0x7f; + if ($headerCRC != $crc) { + Log 3,"$name: Wrong checksum: $crc != $headerCRC"; + } + else { + my $len = 20+12*$frameCount; # 20 Byte Header + 12 Byte per frame + if ($len != length($msg) && length($msg) != 223) { + Log 4,"$name: Wrong message length: $len != ".length($msg); + } else { + if(length($msg) == 223) { + $msg = $msg."a"; + } + my $payload = VBUSIF_DecodePayload($hash,$msg); + if (defined $payload) { + $msg = substr($msg,0,20).$payload; + + $hash->{"${name}_MSGCNT"}++; + $hash->{"${name}_TIME"} = TimeNow(); + $hash->{RAWMSG} = $msg; + my %addvals = (RAWMSG => $msg); + Log3 $hash->{NAME}, 4, ,"Payload ready to dispatch: $msg"; + Dispatch($hash, $msg, \%addvals) if($init_done); + } + } + } + + } + if ($protoVersion == "20") { +# my $command = substr($msg,14,2).substr($msg,12,2); +# my $dataPntId = substr($msg,16,4); +# my $dataPntVal = substr($msg,20,8); +# my $septet = substr($msg,28,2); +# my $checksum = substr($msg,30,2); +# TODO use septet +# TODO validate checksum +# TODO Understand protocol + } + } + } + + $hash->{PARTIAL} = $data; +# return $msg if(defined($local)); + return undef; +} + +sub VBUSIF_Ready($) +{ + my ($hash) = @_; + return DevIo_OpenDev($hash, 1, "VBUSIF_DoInit") if($hash->{STATE} eq "disconnected"); + return 0; +} + + +sub VBUSIF_DecodePayload($@) +{ + my ($hash, $msg) = @_; + my $name = $hash->{NAME}; + + my $frameCount = hex(substr($msg,16,2)); + my $payload = ""; + for (my $i = 0; $i < $frameCount; $i++) { + my $septet = hex(substr($msg,28+$i*12,2)); + my $frameCRC = hex(substr($msg,30+$i*12,2)); + + my $crc = (0x7f - $septet) & 0x7f; + for (my $j = 0; $j<4;$j++) { + my $ch = hex(substr($msg,20+$i*12+$j*2,2)); + $ch |= 0x80 if ($septet & (1 << $j)); + $crc = ($crc - $ch) & 0x7f; + $payload .= chr($ch); + } + + if ($crc != $frameCRC) { + Log 3,"$name: Wrong checksum: $crc != $frameCRC"; + return undef; + } + } + return unpack('H*', $payload); +} + +1; + +=pod +=item device +=begin html + + +

VBUSIF

+
    + This module connects to the RESOL VBUS LAN or Serial Port adapter. + It serves as the "physical" counterpart to the VBUSDevice + devices. +

    + + Define +
      + define <name> VBUS <device> +
      +
      + <device> is a <host>:<port> combination, where + <host> is the address of the RESOL LAN Adapter and <port> 7053. +

      + Examples: +
        + define vbus VBUSLAN 192.168.1.69:7053 +

        + define vbus VBUSIF /dev/ttyS0 +
      +
    +
    +
+ +=end html + +=cut diff --git a/contrib/21_VBUSDEV.pm b/contrib/21_VBUSDEV.pm new file mode 100644 index 000000000..c12a2ef86 --- /dev/null +++ b/contrib/21_VBUSDEV.pm @@ -0,0 +1,1061 @@ +# 21_VBUSDEV.pm +# VBUS Client Device +# +# (c) 2014 Arno Willig +# +# 2014-03-03 19:33:15Z akw +# $Id: 21_VBUSDEV.pm 20151015 2015-10-15 19:54:15Z pejonp $ + +package main; + +use strict; +use warnings; +use POSIX; +use SetExtensions; +use Data::Dumper; + +my %VBUS_devices = ( + "0050" => {"name" => "DL_2", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "Resistor_Sensor_01", "bitSize" => 15, "factor" => 0.1, "unit" => "Ohm" }, + { "offset" => 2,"name" => "Resistor_Sensor_11", "bitSize" => 15, "factor" => 0.1, "unit" => "Ohm" }, + { "offset" => 4,"name" => "Resistor_Sensor_02", "bitSize" => 15, "factor" => 0.1, "unit" => "Ohm" }, + { "offset" => 6,"name" => "Resistor_Sensor_22", "bitSize" => 15, "factor" => 0.1, "unit" => "Ohm" }, + { "offset" => 8,"name" => "Resistor_Sensor_03", "bitSize" => 15, "factor" => 0.1, "unit" => "Ohm" }, + { "offset" => 10,"name" => "Resistor_Sensor_33", "bitSize" => 15, "factor" => 0.1, "unit" => "Ohm" }, + { "offset" => 12,"name" => "Current_Sensor_01", "bitSize" => 15, "factor" => 0.1, "unit" => "mA" }, + { "offset" => 14, "name" => "Current_Sensor_11", "bitSize" => 15, "factor" => 0.1, "unit" => "mA" }, + { "offset" => 28,"name" => "Temperatur_01","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 30,"name" => "Temperatur_02","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 32,"name" => "Temperatur_03","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 34,"name" => "Temperatur_04","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + ]}, + "0053" => {"name" => "DL_3", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "Resistor_Sensor_01", "bitSize" => 15, "factor" => 0.1, "unit" => "Ohm" }, + { "offset" => 2,"name" => "Resistor_Sensor_11", "bitSize" => 15, "factor" => 0.1, "unit" => "Ohm" }, + { "offset" => 4,"name" => "Resistor_Sensor_02", "bitSize" => 15, "factor" => 0.1, "unit" => "Ohm" }, + { "offset" => 6,"name" => "Resistor_Sensor_22", "bitSize" => 15, "factor" => 0.1, "unit" => "Ohm" }, + { "offset" => 8,"name" => "Resistor_Sensor_03", "bitSize" => 15, "factor" => 0.1, "unit" => "Ohm" }, + { "offset" => 10,"name" => "Resistor_Sensor_33", "bitSize" => 15, "factor" => 0.1, "unit" => "Ohm" }, + { "offset" => 12,"name" => "Current_Sensor_01", "bitSize" => 15, "factor" => 0.1, "unit" => "mA" }, + { "offset" => 14,"name" => "Current_Sensor_11", "bitSize" => 15, "factor" => 0.1, "unit" => "mA" }, + { "offset" => 28,"name" => "Temperatur_01","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 30,"name" => "Temperatur_02","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 32,"name" => "Temperatur_03","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 34,"name" => "Temperatur_04","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + ]}, + "1060" => {"name" => "Vitosolic200_SD4", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "temperature_T01","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "temperature_T02","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "temperature_T03","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => "temperature_T04","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 8,"name" => "temperature_T05","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 10,"name" => "temperature_T06","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 12,"name" => "temperature_T07","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 14,"name" => "temperature_T08","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 16,"name" => "temperature_T09","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 18,"name" => "temperature_T10","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 20,"name" => "temperature_T11","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 22,"name" => "temperature_T12","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 24,"name" => "insolation", "bitSize" => 15,"unit" => "W/qm" }, + { "offset" => 28,"name" => "impulse_I01","bitSize" => 31 }, + { "offset" => 32,"name" => "impulse_I02","bitSize" => 31 }, + { "offset" => 36,"name" => "sensorbrokemask","bitSize" => 16 }, + { "offset" => 38,"name" => "sensorshortmask","bitSize" => 16 }, + { "offset" => 40,"name" => "sensorusagemask","bitSize" => 16 }, + { "offset" => 44,"name" => "speed_R01","bitSize" => 8, "unit" => "%" }, + { "offset" => 45,"name" => "speed_R02","bitSize" => 8, "unit" => "%" }, + { "offset" => 46,"name" => "speed_R03","bitSize" => 8, "unit" => "%" }, + { "offset" => 47,"name" => "speed_R04","bitSize" => 8, "unit" => "%" }, + { "offset" => 48,"name" => "speed_R05","bitSize" => 8, "unit" => "%" }, + { "offset" => 49,"name" => "speed_R06","bitSize" => 8, "unit" => "%" }, + { "offset" => 50,"name" => "speed_R07","bitSize" => 8, "unit" => "%" }, + { "offset" => 51,"name" => "speed_R08","bitSize" => 8, "unit" => "%" }, + { "offset" => 52,"name" => "speed_R09","bitSize" => 8, "unit" => "%" }, + { "offset" => 58,"name" => "relaisusagemask","bitSize" => 16 }, + { "offset" => 60,"name" => "errormask","bitSize" => 16 }, + { "offset" => 62,"name" => "warningmask","bitSize" => 16 }, + { "offset" => 64,"name" => "controllerversion","bitSize" => 16 }, + { "offset" => 66,"name" => "systemtime","bitSize" => 16 }, + ]}, + "2251" => {"name" => "DeltaSol_SL", "cmd" => "0100", "fields" => [ +# { "offset" => 0, "name" => "Systemzeit", "bitSize" => 31, "timeRef" => 1 }, + { "offset" => 4, "name" => "Kollektortemperatur", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 6, "name" => "Kesseltemperatur", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 8, "name" => "Temperatur_Sensor_3", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 10, "name" => "Temperatur_Sensor_4", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 12, "name" => "Temperatur_Sensor_5", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, +# { "offset" => 14, "name" => "Temperatur_VFS/RPS", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, +# { "offset" => 20, "name" => "Volumenstrom_V40", "bitSize" => 31, "factor" => 1, "unit" => "1/h" }, +# { "offset" => 24, "name" => "Volumenstrom_VFS", "bitSize" => 31, "factor" => 1, "unit" => "1/h" }, +# { "offset" => 28, "name" => "Volumenstrom_Flowrotor", "bitSize" => 31, "factor" => 1, "unit" => "1/h" }, +# { "offset" => 32, "name" => "Druck_RPS", "bitSize" => 15, "factor" => 0.01, "unit" => "bar" }, + { "offset" => 34, "name" => "Drehzahl_Relais_1", "bitSize" => 7, "factor" => 1, "unit" => "%" }, + { "offset" => 35, "name" => "Drehzahl_Relais_2", "bitSize" => 7, "factor" => 1, "unit" => "%" }, +# { "offset" => 36, "name" => "Drehzahl_Relais_3", "bitSize" => 7, "factor" => 1, "unit" => "%" }, +# { "offset" => 37, "name" => "Drehzahl_Relais_4", "bitSize" => 7, "factor" => 1, "unit" => "%" }, + { "offset" => 38, "name" => "PWM_A", "bitSize" => 7, "factor" => 1, "unit" => "%" }, + { "offset" => 39, "name" => "PWM_B", "bitSize" => 7, "factor" => 1, "unit" => "%" }, +# { "offset" => 40, "name" => "Wärmemenge", "bitSize" => 31, "factor" => 1, "unit" => "Wh" }, + { "offset" => 44, "name" => "SW-Version", "bitSize" => 7, "factor" => 0.01 }, + { "offset" => 48, "name" => "Betriebsstunden_Relais_1", "bitSize" => 31, "factor" => 1, "unit" => "h" }, + { "offset" => 52, "name" => "Betriebsstunden_Relais_2", "bitSize" => 31, "factor" => 1, "unit" => "h" }, +# { "offset" => 56, "name" => "Betriebsstunden_Relais_3", "bitSize" => 31, "factor" => 1, "unit" => "h" }, +# { "offset" => 60, "name" => "Betriebsstunden_Relais_4", "bitSize" => 31, "factor" => 1, "unit" => "h" }, + { "offset" => 64, "name" => "Urlaubsfunktion", "bitSize" => 1, "factor" => 1 }, + { "offset" => 65, "name" => "Blockierschutz_1", "bitSize" => 7, "factor" => 1, "unit" => "%" }, + { "offset" => 66, "name" => "Blockierschutz_2", "bitSize" => 7, "factor" => 1, "unit" => "%" }, +# { "offset" => 67, "name" => "Blockierschutz_3", "bitSize" => 7, "factor" => 1, "unit" => "%" }, + { "offset" => 68, "name" => "Initialisieren", "bitSize" => 31, "factor" => 1 }, + { "offset" => 72, "name" => "Füllung", "bitSize" => 31, "factor" => 1 }, + { "offset" => 76, "name" => "Stabilisieren", "bitSize" => 31, "factor" => 1 }, + { "offset" => 80, "name" => "Pumpenverzögerung", "bitSize" => 7, "factor" => 1 }, + { "offset" => 81, "name" => "Überwärmeabfuhr", "bitSize" => 1, "factor" => 1 }, + { "offset" => 82, "name" => "Nachlauf", "bitSize" => 7, "factor" => 1 }, + { "offset" => 83, "name" => "Thermische_Desinfektion", "bitSize" => 7, "factor" => 1 }, + { "offset" => 84, "name" => "Speicherkühlung", "bitSize" => 1, "factor" => 1 }, + { "offset" => 85, "name" => "Systemkühlung", "bitSize" => 1, "factor" => 1 }, + { "offset" => 86, "name" => "Spreizung", "bitSize" => 7, "factor" => 1 }, + { "offset" => 87, "name" => "Frostschutz", "bitSize" => 7, "factor" => 1 }, + { "offset" => 88, "name" => "Kollektorkühlung", "bitSize" => 1, "factor" => 1 }, +# { "offset" => 89, "name" => "Einheit_Temperatur", "bitSize" => 1, "factor" => 1 }, +# { "offset" => 90, "name" => "Einheit_Durchfluss", "bitSize" => 1, "factor" => 1 }, +# { "offset" => 91, "name" => "Einheit_Druck", "bitSize" => 1, "factor" => 1 }, +# { "offset" => 93, "name" => "Einheit_Energie", "bitSize" => 1, "factor" => 1 }, + { "offset" => 94, "name" => "Speichermaximaltemperatur", "bitSize" => 1, "factor" => 1 }, + { "offset" => 95, "name" => "Neustarts", "bitSize" => 1, "factor" => 1 }, + { "offset" => 96, "name" => "Fehlermaske", "bitSize" => 31, "factor" => 1 }, + ]}, + "4010" => {"name" => "WMZ", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "Heat_kWh","bitSize" => 15,"factor" => 1,"unit" => "kWh" }, + { "offset" => 2,"name" => "Heat_Wh","bitSize" => 15,"factor" => 1,"unit" => "Wh" }, + { "offset" => 4,"name" => "Flow_rate","bitSize" => 15,"factor" => 0.01,"unit" => "qm/h" }, + { "offset" => 6,"name" => "Power","bitSize" => 8,"factor" => 10,"unit" => "W" }, + { "offset" => 8,"name" => "Flow_temperature","bitSize" => 16,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 10,"name" => "Return_temperature","bitSize" => 16,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 12,"name" => "Heat_MWh","bitSize" => 15,"factor" => 1,"unit" => "MWh" }, + { "offset" => 14,"name" => "Power2","bitSize" => 8,"factor" => 2560,"unit" => "W" }, + { "offset" => 15,"name" => "Glycol","bitSize" => 8,"factor" => 1,"unit" => "" }, + { "offset" => 16,"name" => "Pressure","bitSize" => 8,"factor" => 1,"unit" => "bar" }, + ]}, + "4211" => {"name" => "SKSC1/2", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "Temperatur_Sensor1","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "Temperatur_Sensor2","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "Temperatur_Sensor3","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => "Temperatur_Sensor4","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 8,"name" => "Drehzahl_Pumpe1","bitSize" => 8, "unit" => "%" }, +# { "offset" => 9,"name" => "Drehzahl_Pumpe2","bitSize" => 8, "unit" => "%" }, + { "offset" => 10,"name" => "Fehlermaske","bitSize" => 8 }, + { "offset" => 12,"name" => "Betriebsstunden_Pumpe1","bitSize" => 16,"factor" => 1,"unit" => "h" }, +# { "offset" => 14,"name" => "Betriebsstunden_Pumpe2","bitSize" => 16,"factor" => 1,"unit" => "h" }, +# { "offset" => 16,"name" => "Waermemenge1","bitSize" => 16,"factor" => 1,"unit" => "Wh" }, +# { "offset" => 18,"name" => "Waermemenge2","bitSize" => 16,"factor" => 1000,"unit" => "Wh" }, +# { "offset" => 20,"name" => "Waermemenge3","bitSize" => 16,"factor" => 1000000,"unit" => "Wh" }, + ]}, + "4212" => {"name" => "DeltaSolC", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "temperature_T01","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "temperature_T02","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "temperature_T03","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => "temperature_T04","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 8,"name" => "speed_R1","bitSize" => 8, "unit" => "%" }, + { "offset" => 9,"name" => "speed_R2","bitSize" => 8, "unit" => "%" }, + { "offset" => 10,"name" => "errormask","bitSize" => 8 }, + { "offset" => 11,"name" => "variante","bitSize" => 8 }, + { "offset" => 12,"name" => "operating_hours_R1","bitSize" => 16,"factor" => 1,"unit" => "h" }, + { "offset" => 14,"name" => "operating_hours_R2","bitSize" => 16,"factor" => 1,"unit" => "h" }, + { "offset" => 16,"name" => "waermemenge_1","bitSize" => 16,"factor" => 1,"unit" => "Wh" }, + { "offset" => 18,"name" => "waermemenge_2","bitSize" => 16,"factor" => 1000,"unit" => "Wh" }, + { "offset" => 20,"name" => "waermemenge_3","bitSize" => 16,"factor" => 1000000,"unit" => "Wh" }, + { "offset" => 22,"name" => "systemtime","bitSize" => 15 }, + ]}, + "4214" => {"name" => "Sonnenkraft_SKSC2HE", "cmd" => "0100", "dst_addr" => "0010", "fields" => [ + { "offset" => 0,"name" => "Temperatur_Sensor1","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "Temperatur_Sensor2","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "Temperatur_Sensor3","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => "Temperatur_Sensor4","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 24,"name" => "Temperatur_VFD1", "bitSize" => 15,"factor" => 0,1,"unit" => "°C" }, + { "offset" => 26,"name" => "Volumenstrom_VFD1", "bitSize" => 15,"factor" => 1 ,"unit" => "L_h" }, + { "offset" => 8,"name" => "Drehzahl_Relais_1", "bitSize" => 8,"factor" => 1 ,"unit" => "%" }, + { "offset" => 9,"name" => "Drehzahl_Relais_2", "bitSize" => 8,"factor" => 1 ,"unit" => "%" }, + { "offset" => 32,"name" => "Spannung" , "bitSize" => 8,"factor" => 0,1,"unit" => "V" }, + { "offset" => 10,"name" => "Fehlermaske", "bitSize" => 8,"factor" => 1, "unit" => "St" }, + { "offset" => 12,"name" => "Betriebsstunden_Pumpe1","bitSize" => 16,"factor" => 1,"unit" => "h" }, + { "offset" => 14,"name" => "Betriebsstunden_Pumpe2","bitSize" => 16,"factor" => 1,"unit" => "h" }, + { "offset" => 16,"name" => "Waermemenge1","bitSize" => 15,"factor" => 1,"unit" => "Wh" }, + { "offset" => 18,"name" => "Waermemenge2","bitSize" => 15,"factor" => 1000,"unit" => "Wh" }, + { "offset" => 20,"name" => "Waermemenge3","bitSize" => 15,"factor" => 1000000,"unit" => "Wh" }, + ]}, + "4278" => {"name" => "DeltaSol_BS4", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "Kollektortemperatur_T01","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "SpeichertemperaturUnten_T02","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "SpeichertemperaturOben_T03","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => "temperature_T04","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 8,"name" => "speed_R1","bitSize" => 8,"unit" => "%" }, + { "offset" => 9,"name" => "speed_R2","bitSize" => 8,"unit" => "%" }, + { "offset" => 10,"name" => "errorMask","bitSize" => 16 }, + { "offset" => 12,"name" => "operating_hours_R1","bitSize" => 16,"factor" => 1,"unit" => "h" }, + { "offset" => 14,"name" => "operating_hours_R2","bitSize" => 16,"factor" => 1,"unit" => "h" }, + { "offset" => 23,"name" => "Programm","bitSize" => 8,"factor" => 1 }, + { "offset" => 24,"name" => "sw_version","bitSize" => 16,"factor" => 0.01 }, + ]}, + "427b" => {"name" => "DeltaSol_BS_2009", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "temperature_T01","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "temperature_T02","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "temperature_T03","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => "temperature_T04","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 8,"name" => "speed_R1","bitSize" => 8,"unit" => "%" }, + { "offset" => 10,"name" => "operating_hours_R1","bitSize" => 16,"factor" => 1,"unit" => "h" }, + { "offset" => 12,"name" => "speed_R2","bitSize" => 8,"unit" => "%" }, + { "offset" => 14,"name" => "operating_hours_R2","bitSize" => 16,"factor" => 1,"unit" => "h" }, + { "offset" => 16,"name" => "unit_type","bitSize" => 8,"factor" => 1 }, + { "offset" => 17,"name" => "system","bitSize" => 8}, + { "offset" => 20,"name" => "error_mask","bitSize" => 16}, + { "offset" => 20,"name" => "error_S1","bitSize" => 1,"bitPos" => 0}, + { "offset" => 20,"name" => "error_S2","bitSize" => 1,"bitPos" => 1}, + { "offset" => 20,"name" => "error_S3","bitSize" => 1,"bitPos" => 2}, + { "offset" => 20,"name" => "error_S4","bitSize" => 1,"bitPos" => 3}, + { "offset" => 22,"name" => "systemtime","bitSize" => 15 }, + { "offset" => 24,"name" => "status_mask","bitSize" => 32 }, + { "offset" => 28,"name" => "heat_amount","bitSize" => 32,"factor" => 1,"unit" => "Wh" }, + { "offset" => 32,"name" => "sv_version","bitSize" => 16,"factor" => 0.01 }, + { "offset" => 34,"name" => "variant_","bitSize" => 16 }, + ]}, + "5611" => {"name" => "DeltaTherm_FK", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "Temperatur_1","bitSize" => 16,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "Temperatur_2","bitSize" => 16,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "Temperatur_3","bitSize" => 16,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => "Temperatur_4","bitSize" => 16,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 8,"name" => "Drehzahl_Reais_1","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 9,"name" => "Drehzahl_Reais_2","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 10,"name" => "Mischer_Auf","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 11,"name" => "Mischer_Zu","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 12,"name" => "Datum","bitSize" => 32,"factor" => 1,"unit" => "Tage" }, + { "offset" => 16,"name" => "Uhrzeit","bitSize" => 16,"factor" => 1,"unit" => "h" }, + { "offset" => 18,"name" => "Systemmeldung","bitSize" => 8,"factor" => 1,"unit" => "m" }, + ]}, + "6521" => {"name" => "MSR65_1", "cmd" => "0100", "fields" => [ + { "offset" => 0, "name" => "6521_Temperatur_Sensor_1", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 2, "name" => "6521_Temperatur_Sensor_2", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 4, "name" => "6521_Temperatur_Sensor_3", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, +# { "offset" => 8, "name" => "6521_Temperatur_Sensor_5", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + ]}, + "6522" => {"name" => "MSR65_2", "cmd" => "0100", "fields" => [ + { "offset" => 0, "name" => "6522_Temperatur_Sensor_1", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 2, "name" => "6522_Temperatur_Sensor_2", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, +# { "offset" => 8, "name" => "6522_Temperatur_Sensor_5", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + ]}, + "7160" => {"name" => "SKS3HE", "cmd" => "0100", "fields" => [ + { "offset" => 0, "name" => "7160_Temperatur_Sensor_1", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 2, "name" => "7160_Temperatur_Sensor_2", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 4, "name" => "7160_Temperatur_Sensor_3", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, +# { "offset" => 6, "name" => "7160_Temperatur_Sensor_4", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 8, "name" => "7160_Temperatur_Sensor_5", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 10, "name" => "7160_Temperatur_Sensor_6", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, +# { "offset" => 12, "name" => "7160_Temperatur_Sensor_7", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, +# { "offset" => 14, "name" => "7160_Temperatur_Sensor_8", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 36, "name" => "7160_Temperatur_GFD1", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 38, "name" => "7160_Temperatur_GFD2", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 16, "name" => "7160_Einstrahlung", "bitSize" => 15, "factor" => 1, "unit" => "W/qm" }, + { "offset" => 18, "name" => "7160_Volumenstrom", "bitSize" => 31, "factor" => 1, "unit" => "l/h" }, + { "offset" => 44, "name" => "7160_Volumenstrom_2", "bitSize" => 31, "factor" => 1, "unit" => "l/h" }, + { "offset" => 48, "name" => "7160_Volumenstrom_3", "bitSize" => 31, "factor" => 1, "unit" => "l/h" }, + { "offset" => 20, "name" => "7160_Drehzahl_A1", "bitSize" => 8, "factor" => 1, "unit" => "%" }, + { "offset" => 21, "name" => "7160_Drehzahl_A2", "bitSize" => 8, "factor" => 1, "unit" => "%" }, + { "offset" => 22, "name" => "7160_Drehzahl_A3", "bitSize" => 8, "factor" => 1, "unit" => "%" }, + { "offset" => 23, "name" => "7160_Drehzahl_A4", "bitSize" => 8, "factor" => 1, "unit" => "%" }, + { "offset" => 24, "name" => "7160_Wärme", "bitSize" => 15, "factor" => 1, "unit" => "Wh" }, + { "offset" => 26, "name" => "7160_Wärme", "bitSize" => 15, "factor" => 1000, "unit" => "Wh" }, + { "offset" => 28, "name" => "7160_Wärme", "bitSize" => 15, "factor" => 1000000, "unit" => "Wh" }, + { "offset" => 30, "name" => "7160_Wärme", "bitSize" => 15, "factor" => 1000000000, "unit" => "Wh" }, + { "offset" => 60, "name" => "7160_Wärme_2", "bitSize" => 15, "factor" => 1, "unit" => "Wh" }, + { "offset" => 62, "name" => "7160_Wärme_2", "bitSize" => 15, "factor" => 1000, "unit" => "Wh" }, + { "offset" => 64, "name" => "7160_Wärme_2", "bitSize" => 15, "factor" => 1000000, "unit" => "Wh" }, + { "offset" => 66, "name" => "7160_Wärme_2", "bitSize" => 15, "factor" => 1000000000, "unit" => "Wh" }, + { "offset" => 68, "name" => "7160_Wärme_3", "bitSize" => 15, "factor" => 1, "unit" => "Wh" }, + { "offset" => 70, "name" => "7160_Wärme_3", "bitSize" => 15, "factor" => 1000, "unit" => "Wh" }, + { "offset" => 72, "name" => "7160_Wärme_3", "bitSize" => 15, "factor" => 1000000, "unit" => "Wh" }, + { "offset" => 74, "name" => "7160_Wärme_3", "bitSize" => 15, "factor" => 1000000000, "unit" => "Wh" }, + { "offset" => 52, "name" => "7160_Leistung_2", "bitSize" => 31, "factor" => 0.001, "unit" => "kW" }, + { "offset" => 56, "name" => "7160_Leistung_3", "bitSize" => 31, "factor" => 0.001, "unit" => "kW" }, + { "offset" => 32, "name" => "7160_Fehlermaske", "bitSize" => 8, "factor" => 1 }, + { "offset" => 33, "name" => "7160_Sensorbruchnummer", "bitSize" => 8, "factor" => 1 }, + { "offset" => 34, "name" => "7160_Sensorkurzschlussnummer", "bitSize" => 8, "factor" => 1 }, + { "offset" => 42, "name" => "7160_Systemzeit", "bitSize" => 15, "factor" => 1, }, + { "offset" => 42, "name" => "7160_Systemzeit2", "bitSize" => 15, "factor" => 1, "timeRef" => 1 }, + ]}, + "7161" => {"name" => "SKSC3HE_[HK1]", "cmd" => "0100", "fields" => [ + { "offset" => 0, "name" => "7161_HK1_Vorlaufsolltemperatur", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 2, "name" => "7161_Mischerlaufzeit", "bitSize" => 8, "factor" => 1, "unit" => "s" }, + { "offset" => 3, "name" => "7161_Mischerpausenzeit", "bitSize" => 8, "factor" => 1, "unit" => "s" }, + { "offset" => 4, "name" => "7161_HK-Status", "bitSize" => 16, "factor" => 1, "unit" => "" }, + ]}, + "7162" => {"name" => "SKSC3HE_[HK2]", "cmd" => "0100", "fields" => [ + { "offset" => 0, "name" => "7162_HK2_Vorlaufsolltemperatur", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 2, "name" => "7162_Mischerlaufzeit", "bitSize" => 8, "factor" => 1, "unit" => "s" }, + { "offset" => 3, "name" => "7162_Mischerpausenzeit", "bitSize" => 8, "factor" => 1, "unit" => "s" }, + { "offset" => 4, "name" => "7162_HK-Status", "bitSize" => 16, "factor" => 1, "unit" => "" }, + ]}, + "7311" => {"name" => "DeltaSol_M", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "Temperatur_01","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "Temperatur_02","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "Temperatur_03","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => "Temperatur_04","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 8,"name" => "Temperatur_05","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 10,"name" => "Temperatur_06","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 12,"name" => "Temperatur_07","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 14,"name" => "Temperatur_08","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 16,"name" => "Temperatur_09","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 18,"name" => "Temperatur_10","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 20,"name" => "Temperatur_11","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 22,"name" => "Temperatur_12","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 24,"name" => "Einstrahlung", "bitSize" => 15,"unit" => "W/qm" }, + { "offset" => 44,"name" => "Drehzahl_Pumpe_01","bitSize" => 7, "unit" => "%" }, + { "offset" => 45,"name" => "Drehzahl_Pumpe_02","bitSize" => 7, "unit" => "%" }, + { "offset" => 46,"name" => "Drehzahl_Pumpe_03","bitSize" => 7, "unit" => "%" }, + { "offset" => 47,"name" => "Drehzahl_Pumpe_04","bitSize" => 7, "unit" => "%" }, + { "offset" => 48,"name" => "Drehzahl_Pumpe_05","bitSize" => 7, "unit" => "%" }, + { "offset" => 49,"name" => "Drehzahl_Pumpe_06","bitSize" => 7, "unit" => "%" }, + { "offset" => 50,"name" => "Drehzahl_Pumpe_07","bitSize" => 7, "unit" => "%" }, + { "offset" => 51,"name" => "Drehzahl_Pumpe_08","bitSize" => 7, "unit" => "%" }, + { "offset" => 52,"name" => "Drehzahl_Pumpe_09","bitSize" => 7, "unit" => "%" }, + { "offset" => 60,"name" => "Fehlermaske","bitSize" => 16 }, + { "offset" => 62,"name" => "Warnmaske","bitSize" => 16 }, + { "offset" => 64,"name" => "controllerversion","bitSize" => 16 }, + { "offset" => 66,"name" => "systemtime","bitSize" => 16 }, + ]}, + "7312" => {"name" => "DeltaSol_M_HKM", "cmd" => "0100", "fields" => [ + { "offset" => 8,"name" => "Vorlauf_Soll_Temperatur","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + ]}, + "7315" => {"name" => "DeltaSol_M_Volumen", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "Betriebssekunden R1","bitSize" => 15,"unit" => "s" }, + { "offset" => 4,"name" => "Betriebssekunden R2","bitSize" => 15,"unit" => "s" }, + { "offset" => 8,"name" => "Betriebssekunden R3","bitSize" => 15,"unit" => "s" }, + { "offset" => 12,"name" => "Betriebssekunden R4","bitSize" => 15,"unit" => "s" }, + { "offset" => 16,"name" => "Betriebssekunden R5","bitSize" => 15,"unit" => "s" }, + { "offset" => 20,"name" => "Betriebssekunden R6","bitSize" => 15,"unit" => "s" }, + { "offset" => 24,"name" => "Betriebssekunden R7","bitSize" => 15,"unit" => "s" }, + { "offset" => 28,"name" => "Betriebssekunden R8","bitSize" => 15,"unit" => "s" }, + { "offset" => 32,"name" => "Betriebssekunden R9","bitSize" => 15,"unit" => "s" }, + { "offset" => 36,"name" => "Volumen 1","bitSize" => 15,"unit" => "l" }, + { "offset" => 40,"name" => "Volumen 2","bitSize" => 15,"unit" => "l" }, + ]}, + "7316" => {"name" => "DeltaSol_M_WMZ1", "cmd" => "0100", "fields" => [ +# { "offset" => 0,"name" => "Kollektor_Rücklauf","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, +# { "offset" => 2,"name" => "Kollektor_Vorlauf","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "Volumenstrom_Kollektor","bitSize" => 15,"unit" => "l/h" }, + { "offset" => 6,"name" => "Wärmemenge_1","bitSize" => 16,"factor" => 1,"unit" => "Wh" }, + { "offset" => 8,"name" => "Wärmemenge_2","bitSize" => 16,"unit" => "kWh" }, + { "offset" => 10,"name" => "Wärmemenge_3","bitSize" => 16,"unit" => "MWh" }, + ]}, + "7317" => {"name" => "DeltaSol_M_WMZ2", "cmd" => "0100", "fields" => [ +# { "offset" => 0,"name" => "Kollektor_Rücklauf","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, +# { "offset" => 2,"name" => "Kollektor_Vorlauf","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "Volumenstrom_Kollektor","bitSize" => 15,"unit" => "l/h" }, + { "offset" => 6,"name" => "Wärmemenge_1","bitSize" => 16,"factor" => 1,"unit" => "Wh" }, + { "offset" => 8,"name" => "Wärmemenge_2","bitSize" => 16,"unit" => "kWh" }, + { "offset" => 10,"name" => "Wärmemenge_3","bitSize" => 16,"unit" => "MWh" }, + ]}, + "7321" => {"name" => "Vitosolic200", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "temperature_T01","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "temperature_T02","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "temperature_T03","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => "temperature_T04","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 8,"name" => "temperature_T05","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 10,"name" => "temperature_T06","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 12,"name" => "temperature_T07","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 14,"name" => "temperature_T08","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 16,"name" => "temperature_T09","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 18,"name" => "temperature_T10","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 20,"name" => "temperature_T11","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 22,"name" => "temperature_T12","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 24,"name" => "insolation", "bitSize" => 15,"unit" => "W/qm" }, + { "offset" => 28,"name" => "impulse_I01","bitSize" => 31 }, + { "offset" => 32,"name" => "impulse_I02","bitSize" => 31 }, + { "offset" => 36,"name" => "sensorbrokemask","bitSize" => 16 }, + { "offset" => 38,"name" => "sensorshortmask","bitSize" => 16 }, + { "offset" => 40,"name" => "sensorusagemask","bitSize" => 16 }, + { "offset" => 44,"name" => "speed_R01","bitSize" => 8, "unit" => "%" }, + { "offset" => 45,"name" => "speed_R02","bitSize" => 8, "unit" => "%" }, + { "offset" => 46,"name" => "speed_R03","bitSize" => 8, "unit" => "%" }, + { "offset" => 47,"name" => "speed_R04","bitSize" => 8, "unit" => "%" }, + { "offset" => 48,"name" => "speed_R05","bitSize" => 8, "unit" => "%" }, + { "offset" => 49,"name" => "speed_R06","bitSize" => 8, "unit" => "%" }, + { "offset" => 50,"name" => "speed_R07","bitSize" => 8, "unit" => "%" }, + { "offset" => 51,"name" => "speed_R08","bitSize" => 8, "unit" => "%" }, + { "offset" => 52,"name" => "speed_R09","bitSize" => 8, "unit" => "%" }, + { "offset" => 58,"name" => "relaisusagemask","bitSize" => 16 }, + { "offset" => 60,"name" => "errormask","bitSize" => 16 }, + { "offset" => 62,"name" => "warningmask","bitSize" => 16 }, + { "offset" => 64,"name" => "controllerversion","bitSize" => 16 }, + { "offset" => 66,"name" => "systemtime","bitSize" => 16 }, + ]}, + "7326" => {"name" => "Vitosolic200_WMZ1", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "WMZ1_Vorlauf","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "WMZ1_Ruecklauf","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "WMZ1_volumeflow","bitSize" => 15,"unit" => "l/h" }, + { "offset" => 6,"name" => "WMZ1_heatquantity1","bitSize" => 16,"factor" => 1,"unit" => "Wh" }, + { "offset" => 8,"name" => "WMZ1_heatquantity2","bitSize" => 16,"unit" => "kWh" }, + { "offset" => 10,"name" => "WMZ1_heatquantity3","bitSize" => 16,"unit" => "MWh" }, + ]}, + "7327" => {"name" => "Vitosolic200_WMZ2", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "WMZ2_Vorlauf","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "WMZ2_Ruecklauf","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "WMZ2_volumeflow","bitSize" => 15,"unit" => "l/h" }, + { "offset" => 6,"name" => "WMZ2_heatquantity1","bitSize" => 16,"factor" => 1,"unit" => "Wh" }, + { "offset" => 8,"name" => "WMZ2_heatquantity2","bitSize" => 16,"unit" => "kWh" }, + { "offset" => 10,"name" => "WMZ2_heatquantity3","bitSize" => 16,"unit" => "MWh" }, + ]}, + "7331" => {"name" => "SLR", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => " Temperature_1","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => " Temperature_2","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => " Temperature_3","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => " Temperature_4","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 8,"name" => " Temperature_5","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 10,"name" => " Temperature_6","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 12,"name" => " Temperature_7","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 14,"name" => " Temperature_8","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 16,"name" => " Temperature_9","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 18,"name" => " Temperature_10","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 20,"name" => " Temperature_11","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 22,"name" => " Temperature_12","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 24,"name" => " Temperature_13","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 26,"name" => " Temperature_14","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 28,"name" => " Temperature_15","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 30,"name" => " Temperature_16","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 32,"name" => " Temperature_17","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 34,"name" => " Temperature_18","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 36,"name" => " Temperature_19","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 38,"name" => " Temperature_20","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 40,"name" => " Temperature_21","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 42,"name" => " Temperature_22","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 44,"name" => " Pump_R1","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 45,"name" => " Pump_R2","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 46,"name" => " Pump_R3","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 47,"name" => " Pump_R4","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 48,"name" => " Pump_R5","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 49,"name" => " Pump_R6","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 50,"name" => " Pump_R7","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 51,"name" => " Pump_R8","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 52,"name" => " Pump_R9","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 53,"name" => " Pump_R10","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 54,"name" => " Pump_R11","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 55,"name" => " Pump_R12","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 56,"name" => " Pump_R13","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 57,"name" => " Pump_R14","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 58,"name" => " Pump_R15","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 59,"name" => " Pump_R16","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 60,"name" => " Pump_R17","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 61,"name" => " Pump_R18","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 64,"name" => " Sensor_mask","bitSize" => 31,"factor" => 1,"unit" => "1" }, + { "offset" => 68,"name" => " Sensor_mask","bitSize" => 31,"factor" => 2,"unit" => "1" }, + { "offset" => 72,"name" => " Error_1","bitSize" => 15 }, + { "offset" => 74,"name" => " Warning_1","bitSize" => 15 }, + { "offset" => 76,"name" => " Version_","bitSize" => 15 }, + { "offset" => 78,"name" => " System_1","bitSize" => 15 }, + { "offset" => 80,"name" => " Variant_","bitSize" => 8 }, + ]}, + "7341" => {"name" => "CitrinSLR_XT", "cmd" => "0100", "fields" => [ + { "offset" => 0, "name" => "S1-SF-K", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 2, "name" => "S2-SF-1", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 4, "name" => "S3-SF-2", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 6, "name" => "S4-SF-3", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 8, "name" => "S5-FN-HK", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 10, "name" => "S6-FN-WW", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 12, "name" => "S7-FN-K2", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 14, "name" => "S8-FZ", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 16, "name" => "S9-AF", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 18, "name" => "S10-VL-F1", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 20, "name" => "S11-FV-1", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 22, "name" => "S12-VL-F", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 24, "name" => "S13-FV-", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 26, "name" => "S14-KF", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 28, "name" => "S15-KF-", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 30, "name" => "S16-BF", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 32, "name" => "SensorVolumenstrom_Regler_GAS1_TotalWert_L", "bitSize" => 31, "unit" => "L" }, +# { "offset" => 36, "name" => "SensorVolumenstrom_Regler_GAS2_TotalWert_L", "bitSize" => 31, "unit" => "L" }, +# { "offset" => 40, "name" => "SensorVolumenstrom_Regler_GDS1_TotalWert_L", "bitSize" => 31, "unit" => "L" }, +# { "offset" => 44, "name" => "SensorVolumenstrom_Regler_GDS2_TotalWert_L", "bitSize" => 31, "unit" => "L" }, + { "offset" => 48, "name" => "Sensor_Regler_Druck_GAS1_Wert_Bar", "bitSize" => 15, "factor" => 0.01, "unit" => "bar" }, + { "offset" => 50, "name" => "Sensor_Regler_Druck_GAS2_Wert_Bar", "bitSize" => 15, "factor" => 0.01, "unit" => "bar" }, +# { "offset" => 52, "name" => "Sensor_Regler_Druck_GDS1_Wert_Bar", "bitSize" => 15, "factor" => 0.01, "unit" => "bar" }, +# { "offset" => 54, "name" => "Sensor_Regler_Druck_GDS2_Wert_Bar", "bitSize" => 15, "factor" => 0.01, "unit" => "bar" }, + { "offset" => 56, "name" => "R1-SP-1", "bitSize" => 7, "unit" => "%" }, + { "offset" => 57, "name" => "R2-SP-2", "bitSize" => 7, "unit" => "%" }, + { "offset" => 58, "name" => "R3-BL", "bitSize" => 7, "unit" => "%" }, + { "offset" => 59, "name" => "R4-SV", "bitSize" => 7, "unit" => "%" }, + { "offset" => 60, "name" => "R5-HKP1", "bitSize" => 7, "unit" => "%" }, + { "offset" => 61, "name" => "R6-MV-1_auf", "bitSize" => 7, "unit" => "%" }, + { "offset" => 62, "name" => "R7-MV-1_zu", "bitSize" => 7, "unit" => "%" }, + { "offset" => 63, "name" => "R8-KLP-", "bitSize" => 7, "unit" => "%" }, + { "offset" => 64, "name" => "R9-KLP-", "bitSize" => 7, "unit" => "%", "bitSize" => 7 }, + { "offset" => 65, "name" => "R10-SV-", "bitSize" => 7, "unit" => "%" }, + { "offset" => 66, "name" => "R11-MV-2_auf", "bitSize" => 7, "unit" => "%" }, + { "offset" => 67, "name" => "R12-MV-2_zu", "bitSize" => 7, "unit" => "%" }, + { "offset" => 68, "name" => "R13-ZP", "bitSize" => 7, "unit" => "%" }, + { "offset" => 69, "name" => "R14-RP", "bitSize" => 7, "unit" => "%" }, + { "offset" => 72, "name" => "Hk1_T_VorlSoll", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, +# { "offset" => 74, "name" => "Hk2_T_VorlSoll", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, +# { "offset" => 76, "name" => "Hk3_T_VorlSoll", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, +# { "offset" => 78, "name" => "Hk4_T_VorlSoll", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, +# { "offset" => 80, "name" => "Hk5_T_VorlSoll", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 82, "name" => "SW_VL_Soll", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 84, "name" => "Wmz1_Wert_Wh", "bitSize" => 31, "unit" => "Wh" }, + { "offset" => 88, "name" => "Wmz2_Wert_Wh", "bitSize" => 31, "unit" => "Wh" }, +# { "offset" => 92, "name" => "Systemdatum", "bitSize" => 31, }, + { "offset" => 96, "name" => "SensorBenutzt_bit_0..31", "bitSize" => 32, }, + { "offset" => 100, "name" => "SensorBenutzt_bit_31..63", "bitSize" => 32, }, + { "offset" => 104, "name" => "Error_SensorBruch_bit_0..31", "bitSize" => 32, }, + { "offset" => 108, "name" => "Error_SensorBruch_bit_31..63", "bitSize" => 32, }, + { "offset" => 112, "name" => "Error_SensorKurzschluss_bit_0..31", "bitSize" => 32, }, + { "offset" => 116, "name" => "Error_SensorKurzschluss_bit_31..63", "bitSize" => 32, }, + { "offset" => 120, "name" => "Errormask", "bitSize" => 16, }, + { "offset" => 122, "name" => "Warningmask", "bitSize" => 16, }, + { "offset" => 124, "name" => "Systemflow.Parameteraenderungen", "bitSize" => 16, }, + ]}, + "7411" => {"name" => "DeltaSol_ES", "cmd" => "0100", "fields" => [ + { "offset" => 0, "name" => "Temperatur_Sensor_1", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 2, "name" => "Temperatur_Sensor_2", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 4, "name" => "Temperatur_Sensor_3", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 6, "name" => "Temperatur_Sensor_4", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 8, "name" => "Temperatur_Sensor_5", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 10, "name" => "Temperatur_Sensor_6", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 12, "name" => "Temperatur_Sensor_7", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 14, "name" => "Temperatur_Sensor_8", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 16, "name" => "Volumenstrom", "bitSize" => 15, "factor" => 0.01, "unit" => "m" }, + { "offset" => 18, "name" => "Einstrahlung", "bitSize" => 15 }, + { "offset" => 20, "name" => "Relaisbyte", "bitSize" => 8 }, + { "offset" => 21, "name" => "Drehzahl_1", "bitSize" => 8, "unit" => "%" }, + { "offset" => 22, "name" => "Drehzahl_2", "bitSize" => 8, "unit" => "%" }, + { "offset" => 23, "name" => "Drehzahl_3", "bitSize" => 8, "unit" => "%" }, + { "offset" => 20, "name" => "Relais_4", "bitSize" => 1, "bitPos" => 3 }, + { "offset" => 20, "name" => "Relais_5", "bitSize" => 1, "bitPos" => 4 }, + { "offset" => 20, "name" => "Relais_6", "bitSize" => 1, "bitPos" => 5 }, + { "offset" => 24, "name" => "Systemzeit", "bitSize" => 15, "format" => "t", "timeRef" => 1 }, + { "offset" => 26, "name" => "Schema", "bitSize" => 8 }, + { "offset" => 27, "name" => "Option:_Kollektorkühlung", "bitSize" => 1, "bitPos" => 0 }, + { "offset" => 27, "name" => "Option:_Kollektorminimalbegrenzung", "bitSize" => 1, "bitPos" => 1 }, + { "offset" => 27, "name" => "Option:_Frostschutzfunktion", "bitSize" => 1, "bitPos" => 2 }, + { "offset" => 27, "name" => "Option:_Röhrenkollektorfunktion", "bitSize" => 1, "bitPos" => 3 }, + { "offset" => 27, "name" => "Option:_Rückkühlung", "bitSize" => 1, "bitPos" => 4 }, + { "offset" => 27, "name" => "Option:_Wärmemengenzählung", "bitSize" => 1, "bitPos" => 5 }, + { "offset" => 28, "name" => "Betriebsstunden_1", "bitSize" => 16, "unit" => "h" }, + { "offset" => 30, "name" => "Betriebsstunden_2", "bitSize" => 16, "unit" => "h" }, + { "offset" => 32, "name" => "Betriebsstunden_3", "bitSize" => 16, "unit" => "h" }, + { "offset" => 34, "name" => "Betriebsstunden_4", "bitSize" => 16, "unit" => "h" }, + { "offset" => 36, "name" => "Betriebsstunden_5", "bitSize" => 16, "unit" => "h" }, + { "offset" => 38, "name" => "Betriebsstunden_6", "bitSize" => 16, "unit" => "h" }, + { "offset" => 39, "name" => "Wärmemenge_1","bitSize" => 16,"factor" => 1,"unit" => "Wh" }, + { "offset" => 40, "name" => "Wärmemenge_2","bitSize" => 16,"factor" => 1,"unit" => "Wh" }, + { "offset" => 42, "name" => "Wärmemenge_3","bitSize" => 16,"factor" => 1000,"unit" => "Wh" }, + { "offset" => 44, "name" => "Wärmemenge_4","bitSize" => 16,"factor" => 1000000,"unit" => "Wh" }, + ]}, + "7421" => {"name" => "DeltaSol_BX", "cmd" => "0100", "fields" => [ + { "offset" => 0, "name" => "Temperatur_Sensor_1", "bitSize" => 15, "factor" => 0.1 }, + { "offset" => 2, "name" => "Temperatur_Sensor_2", "bitSize" => 15, "factor" => 0.1 }, + { "offset" => 4, "name" => "Temperatur_Sensor_3", "bitSize" => 15, "factor" => 0.1 }, + { "offset" => 6, "name" => "Temperatur_Sensor_4", "bitSize" => 15, "factor" => 0.1 }, + { "offset" => 8, "name" => "Temperatur_Sensor_5", "bitSize" => 15, "factor" => 0.1 }, + { "offset" => 10, "name" => "Temperatur_RPS", "bitSize" => 15, "factor" => 0.1 }, + { "offset" => 12, "name" => "Druck_RPS", "bitSize" => 15, "factor" => 0.1 }, + { "offset" => 14, "name" => "Temperatur_VFS", "bitSize" => 15, "factor" => 0.1 }, + { "offset" => 16, "name" => "Durchfluss_VFS", "bitSize" => 15, "factor" => 1 }, + { "offset" => 24, "name" => "Drehzahl_Relais_1", "bitSize" => 8, "unit" => "%" }, + { "offset" => 25, "name" => "Drehzahl_Relais_2", "bitSize" => 8, "unit" => "%" }, + { "offset" => 26, "name" => "Drehzahl_Relais_3", "bitSize" => 8, "unit" => "%" }, + { "offset" => 27, "name" => "Drehzahl_Relais_4", "bitSize" => 8, "unit" => "%" }, + { "offset" => 22, "name" => "PWM_1", "bitSize" => 8, "unit" => "%" }, + { "offset" => 23, "name" => "PWM_2", "bitSize" => 8, "unit" => "%" }, + { "offset" => 16, "name" => "Durchfluss_VFS", "bitSize" => 15, "factor" => 1 }, + { "offset" => 18, "name" => "Durchfluss_V40", "bitSize" => 15, "factor" => 1 }, + { "offset" => 48, "name" => "Waermemenge", "bitSize" => 31, "factor" => 1 }, + { "offset" => 54, "name" => "Systemzeit", "bitSize" => 16 }, + { "offset" => 56, "name" => "Datum", "bitSize" => 32 }, + { "offset" => 52, "name" => "Version", "bitSize" => 16, "factor" => 0.01 }, + { "offset" => 28, "name" => "Betriebssekunden_Relais_1", "bitSize" => 32, "unit" => "s" }, + { "offset" => 32, "name" => "Betriebssekunden_Relais_2", "bitSize" => 32, "unit" => "s" }, + { "offset" => 36, "name" => "Betriebssekunden_Relais_3", "bitSize" => 32, "unit" => "s" }, + { "offset" => 40, "name" => "Betriebssekunden_Relais_4", "bitSize" => 32, "unit" => "s" }, + { "offset" => 46, "name" => "Status", "bitSize" => 16 }, + { "offset" => 46, "name" => "Blockierschutz_1", "bitSize" => 1, "bitPos" => 0 }, + { "offset" => 46, "name" => "Blockierschutz_2", "bitSize" => 1, "bitPos" => 1 }, + { "offset" => 46, "name" => "Blockierschutz_3", "bitSize" => 1, "bitPos" => 2 }, + { "offset" => 46, "name" => "Blockierschutz_4", "bitSize" => 1, "bitPos" => 3 }, + { "offset" => 46, "name" => "Initialisierung", "bitSize" => 1, "bitPos" => 4 }, + { "offset" => 46, "name" => "Fuellung", "bitSize" => 1, "bitPos" => 5 }, + { "offset" => 46, "name" => "Stabilisierung", "bitSize" => 1, "bitPos" => 6 }, + { "offset" => 46, "name" => "Pumpenverzoegerung", "bitSize" => 1, "bitPos" => 7 }, + { "offset" => 47, "name" => "ueberwaermeabfuhr", "bitSize" => 1, "bitPos" => 0 }, + { "offset" => 47, "name" => "Nachlauf", "bitSize" => 1, "bitPos" => 1 }, + { "offset" => 47, "name" => "Thermische_Desinfektion", "bitSize" => 1, "bitPos" => 2 }, + { "offset" => 47, "name" => "Systemkuehlung", "bitSize" => 1, "bitPos" => 3 }, + { "offset" => 47, "name" => "Speicherkuehlung", "bitSize" => 1, "bitPos" => 4 }, + { "offset" => 47, "name" => "Spreizung", "bitSize" => 1, "bitPos" => 5 }, + { "offset" => 47, "name" => "Frostschutz", "bitSize" => 1, "bitPos" => 6 }, + { "offset" => 47, "name" => "Kollektorkuehlung", "bitSize" => 1, "bitPos" => 7 }, + { "offset" => 20, "name" => "Einheit", "bitSize" => 8 }, + { "offset" => 44, "name" => "Fehler", "bitSize" => 16 }, + { "offset" => 44, "name" => "Fehler_S1", "bitSize" => 1, "bitPos" => 0 }, + { "offset" => 44, "name" => "Fehler_S2", "bitSize" => 1, "bitPos" => 1 }, + { "offset" => 44, "name" => "Fehler_S3", "bitSize" => 1, "bitPos" => 2 }, + { "offset" => 44, "name" => "Fehler_S4", "bitSize" => 1, "bitPos" => 3 }, + { "offset" => 44, "name" => "Fehler_S5", "bitSize" => 1, "bitPos" => 4 }, + { "offset" => 44, "name" => "Fehler_S6", "bitSize" => 1, "bitPos" => 5 }, + { "offset" => 44, "name" => "Fehler_S7", "bitSize" => 1, "bitPos" => 6 }, + { "offset" => 44, "name" => "Fehler_S8", "bitSize" => 1, "bitPos" => 7 }, + { "offset" => 45, "name" => "Fehler_S9", "bitSize" => 1, "bitPos" => 0 }, + { "offset" => 45, "name" => "Fehler_V40", "bitSize" => 1, "bitPos" => 1 }, + { "offset" => 45, "name" => "Leckage", "bitSize" => 1, "bitPos" => 2 }, + { "offset" => 45, "name" => "ueberdruck", "bitSize" => 1, "bitPos" => 3 }, + { "offset" => 45, "name" => "Durchflussfehler", "bitSize" => 1, "bitPos" => 4 }, + ]}, + "7721" => {"name" => "DeltaSolE_Regler", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "temperature_T01","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "temperature_T02","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "temperature_T03","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => "temperature_T04","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 8,"name" => "temperature_T05","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 10,"name" => "temperature_T06","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 12,"name" => "temperature_T07","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 14,"name" => "temperature_T08","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 16,"name" => "temperature_T09","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 18,"name" => "temperature_T10","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, +# { "offset" => 20,"name" => "insolation", "bitSize" => 15,"unit" => "W/qm" }, + { "offset" => 26,"name" => "speed_R01","bitSize" => 7, "unit" => "%" }, + { "offset" => 27,"name" => "speed_R02","bitSize" => 7, "unit" => "%" }, + { "offset" => 28,"name" => "speed_R03","bitSize" => 7, "unit" => "%" }, + { "offset" => 29,"name" => "speed_R04","bitSize" => 7, "unit" => "%" }, + { "offset" => 30,"name" => "speed_R05","bitSize" => 7, "unit" => "%" }, + { "offset" => 31,"name" => "speed_R06","bitSize" => 7, "unit" => "%" }, + { "offset" => 32,"name" => "speed_R07","bitSize" => 7, "unit" => "%" }, + { "offset" => 36,"name" => "errormask","bitSize" => 16 }, + { "offset" => 38,"name" => "warningmask","bitSize" => 16 }, + { "offset" => 56,"name" => "temperature_T11","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 58,"name" => "statusHK","bitSize" => 16 }, +# { "offset" => 64,"name" => "controllerversion","bitSize" => 16 }, +# { "offset" => 66,"name" => "systemtime","bitSize" => 16 }, + ]}, + "7722" => {"name" => "DeltaSolE_WMZ", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "T10","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "T9","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "volumeflow","bitSize" => 15,"unit" => "l/h" }, + { "offset" => 6,"name" => "heatquantity1","bitSize" => 16,"factor" => 1,"unit" => "Wh" }, + { "offset" => 8,"name" => "heatquantity2","bitSize" => 16,"unit" => "kWh" }, + { "offset" => 10,"name" => "heatquantity3","bitSize" => 16,"unit" => "MWh" }, + ]}, + "7751" => {"name" => "DiemasolC", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "temperature_T01","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "temperature_T02","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "temperature_T03","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => "temperature_T04","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 8,"name" => "temperature_T05","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 10,"name" => "temperature_T06","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 12,"name" => "temperature_T07","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 14,"name" => "temperature_T08","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 16,"name" => "temperature_T09","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 18,"name" => "temperature_T10","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 20,"name" => "temperature_T11","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 22,"name" => "volumeflow", "bitSize" => 15,"factor" => 0.1,"unit" => "l/min"}, + { "offset" => 24,"name" => "speed_R01", "bitSize" => 8, "unit" => "%"}, + { "offset" => 25,"name" => "speed_R02", "bitSize" => 8, "unit" => "%"}, + { "offset" => 26,"name" => "speed_R03", "bitSize" => 8, "unit" => "%"}, + { "offset" => 27,"name" => "relais_R04", "bitPos" => 0, "bitSize" => 1 }, + { "offset" => 27,"name" => "relais_R05", "bitPos" => 1, "bitSize" => 1 }, + { "offset" => 27,"name" => "relais_R06", "bitPos" => 2, "bitSize" => 1 }, + { "offset" => 27,"name" => "relais_R07", "bitPos" => 3, "bitSize" => 1 }, + { "offset" => 27,"name" => "relais_R08", "bitPos" => 4, "bitSize" => 1 }, + { "offset" => 27,"name" => "relais_R09", "bitPos" => 5, "bitSize" => 1 }, + { "offset" => 28,"name" => "heatquantity", "bitSize" => 32, "factor" => 0.001,"unit" => "kWh" }, + ]}, + "7821" => {"name" => "Cosmo_Multi_Regler", "cmd" => "0100", "fields" => [ + { "offset" => 0, "name" => "Temperatur_Sensor_1", "bitSize" => 15, "factor" => 0.1, "unit" => "°C " }, + { "offset" => 2, "name" => "Temperatur_Sensor_2", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 4, "name" => "Temperatur_Sensor_3", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 6, "name" => "Temperatur_Sensor_4", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 8, "name" => "Temperatur_Sensor_5", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 10, "name" => "Temperatur_Sensor_6", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 12, "name" => "Temperatur_Sensor_7", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 14, "name" => "Temperatur_Sensor_8", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 16, "name" => "Temperatur_Sensor_9", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 18, "name" => "Temperatur_Sensor_10", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 20, "name" => "Einstrahlung_CS", "bitSize" => 15, "factor" => 1 }, + { "offset" => 22, "name" => "Impulse_1_V40", "bitSize" => 16, "factor" => 1 }, + { "offset" => 24, "name" => "Digital_Input", "bitSize" => 16, "factor" => 1 }, + { "offset" => 26, "name" => "Drehzahl_Relais_1", "bitSize" => 7, "unit" => "%" }, + { "offset" => 27, "name" => "Drehzahl_Relais_2", "bitSize" => 7, "unit" => "%" }, + { "offset" => 28, "name" => "Drehzahl_Relais_3", "bitSize" => 7, "unit" => "%" }, + { "offset" => 29, "name" => "Drehzahl_Relais_4", "bitSize" => 7, "unit" => "%" }, + { "offset" => 30, "name" => "Drehzahl_Relais_5", "bitSize" => 7, "unit" => "%" }, + { "offset" => 31, "name" => "Drehzahl_Relais_6", "bitSize" => 7, "unit" => "%" }, + { "offset" => 32, "name" => "Drehzahl_Relais_7", "bitSize" => 7, "unit" => "%" }, + { "offset" => 36, "name" => "Fehlermaske", "bitSize" => 16 }, + { "offset" => 38, "name" => "Meldungen", "bitSize" => 16 }, + { "offset" => 40, "name" => "System", "bitSize" => 7 }, + { "offset" => 42, "name" => "Schema", "bitSize" => 16 }, + { "offset" => 44, "name" => "Vorlauf_Soll_HK1_Modul_Sensor_18", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 46, "name" => "Status_HK1_Modul", "bitSize" => 16 }, + { "offset" => 48, "name" => "Vorlauf_Soll_HK2_Modul_Sensor_25", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 50, "name" => "Status_HK2_Modul", "bitSize" => 16}, + { "offset" => 52, "name" => "Vorlauf_Soll_HK3_Modul_Sensor_32", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 54, "name" => "Status_HK3_Modul", "bitSize" => 16 }, + { "offset" => 56, "name" => "Vorlauf_Soll_Heizkreis_Sensor_11", "bitSize" => 15, "factor" => 0.1, "unit" => "°C" }, + { "offset" => 58, "name" => "Status_Heizkreis", "bitSize" => 16 }, + { "offset" => 62, "name" => "Systemzeit", "bitSize" => 15, "timeRef" => 1 }, + { "offset" => 64, "name" => "Jahr", "bitSize" => 15, "factor" => 1 }, + { "offset" => 66, "name" => "Monat", "bitSize" => 7, "factor" => 1 }, + { "offset" => 67, "name" => "Tag", "bitSize" => 7, "factor" => 1 }, + ]}, + "7822" => {"name" => "Cosmo_Multi_WMZ", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "Temperatur_Vorlauf","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "Temperatur_Ruecklauf","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "Durchfluss_Sensor_8","bitSize" => 15,"unit" => "l/h" }, + { "offset" => 6,"name" => "heatquantity1","bitSize" => 16,"factor" => 1,"unit" => "Wh" }, + { "offset" => 8,"name" => "heatquantity2","bitSize" => 16,"factor" => 1000,"unit" => "kWh" }, + { "offset" => 10,"name" => "heatquantity3","bitSize" => 16,"factor" => 1000000,"unit" => "MWh" }, + ]}, + "7e11" => {"name" => "DeltaSol_MX_Regler", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "Temperatur_1","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "Temperatur_2","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "Temperatur_3","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => "Temperatur_4","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 8,"name" => "Temperatur_5","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 10,"name" => "Temperatur_6","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 12,"name" => "Temperatur_7","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 14,"name" => "Temperatur_8","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 16,"name" => "Temperatur_9","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 18,"name" => "Temperatur_10","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 20,"name" => "Temperatur_11","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 22,"name" => "Temperatur_12","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 24,"name" => "Temperatur_13","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 26,"name" => "Temperatur_14","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 28,"name" => "Temperatur_15","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 30,"name" => "Temperatur_16","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 32,"name" => "Temperatur_17","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 34,"name" => "Temperatur_18","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 36,"name" => "Temperatur_19","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 38,"name" => "Temperatur_20","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 40,"name" => "Volumenstrom_13","bitSize" => 31,"factor" => 1,"unit" => "l/h" }, + { "offset" => 44,"name" => "Volumenstrom_14","bitSize" => 31,"factor" => 1,"unit" => "l/h" }, + { "offset" => 48,"name" => "Volumenstrom_15","bitSize" => 31,"factor" => 1,"unit" => "l/h" }, + { "offset" => 52,"name" => "Volumenstrom_17","bitSize" => 31,"factor" => 1,"unit" => "l/h" }, + { "offset" => 56,"name" => "Volumenstrom_18","bitSize" => 31,"factor" => 1,"unit" => "l/h" }, + { "offset" => 60,"name" => "Volumenstrom_19","bitSize" => 31,"factor" => 1,"unit" => "l/h" }, + { "offset" => 64,"name" => "Volumenstrom_20","bitSize" => 31,"factor" => 1,"unit" => "l/h" }, + { "offset" => 68,"name" => "Drucksensor_17","bitSize" => 15,"factor" => 0.01,"unit" => "bar" }, + { "offset" => 70,"name" => "Drucksensor_18","bitSize" => 15,"factor" => 0.01,"unit" => "bar" }, + { "offset" => 72,"name" => "Drucksensor_19","bitSize" => 15,"factor" => 0.01,"unit" => "bar" }, + { "offset" => 74,"name" => "Drucksensor_20","bitSize" => 15,"factor" => 0.01,"unit" => "bar" }, + { "offset" => 76,"name" => "Drehzahl_1","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 77,"name" => "Drehzahl_2","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 78,"name" => "Drehzahl_3","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 79,"name" => "Drehzahl_4","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 80,"name" => "Drehzahl_5","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 81,"name" => "Drehzahl_6","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 82,"name" => "Drehzahl_7","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 83,"name" => "Drehzahl_8","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 84,"name" => "Drehzahl_9","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 85,"name" => "Drehzahl_10","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 86,"name" => "Drehzahl_11","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 87,"name" => "Drehzahl_12","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 88,"name" => "Drehzahl_13","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 89,"name" => "Drehzahl_14","bitSize" => 8,"factor" => 1,"unit" => "%" }, + { "offset" => 92,"name" => "Systemdatum","bitSize" => 31}, + { "offset" => 96,"name" => "Fehlermaske","bitSize" => 31}, + ]}, + "7e12" => {"name" => "DeltaSol_MX_Module", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "Temperatur_M1_S1","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "Temperatur_M1_S2","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 4,"name" => "Temperatur_M1_S3","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 6,"name" => "Temperatur_M1_S4","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 8,"name" => "Temperatur_M1_S5","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 10,"name" => "Temperatur_M1_S6","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 12,"name" => "Temperatur_M2_S1","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 14,"name" => "Temperatur_M2_S2","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 16,"name" => "Temperatur_M2_S3","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 18,"name" => "Temperatur_M2_S4","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 20,"name" => "Temperatur_M2_S5","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 22,"name" => "Temperatur_M2_S6","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 24,"name" => "Temperatur_M3_S1","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 26,"name" => "Temperatur_M3_S2","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 28,"name" => "Temperatur_M3_S3","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 30,"name" => "Temperatur_M3_S4","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 32,"name" => "Temperatur_M3_S5","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 34,"name" => "Temperatur_M3_S6","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 36,"name" => "Temperatur_M4_S1","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 38,"name" => "Temperatur_M4_S2","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 40,"name" => "Temperatur_M4_S3","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 42,"name" => "Temperatur_M4_S4","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 44,"name" => "Temperatur_M4_S5","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 46,"name" => "Temperatur_M4_S6","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 48,"name" => "Temperatur_M5_S1","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 50,"name" => "Temperatur_M5_S2","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 52,"name" => "Temperatur_M5_S3","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 54,"name" => "Temperatur_M5_S4","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 56,"name" => "Temperatur_M5_S5","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 58,"name" => "Temperatur_M5_S6","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + ]}, + "7e21" => {"name" => "DeltaSol_MX_Heizkreis", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "Vorlauf_Soll_Temperatur","bitSize" => 15,"factor" => 0.1,"unit" => "°C" }, + { "offset" => 2,"name" => "Betriebsstatus","bitSize" => 8}, + ]}, + "7e31" => {"name" => "DeltaSol_MX_WMZ", "cmd" => "0100", "fields" => [ + { "offset" => 0,"name" => "Waermemenge","bitSize" => 31,"factor" => 1,"unit" => "Wh" }, + { "offset" => 8,"name" => "Waermemenge_heute","bitSize" => 31,"factor" => 1,"unit" => "Wh" }, + { "offset" => 12,"name" => "Waermemenge_Woche","bitSize" => 31,"factor" => 1,"unit" => "Wh" }, + ]}, +); + +# Example: speed R04: 30 % + +sub VBUSDEV_DbLog_splitFn($$) { + my ($event, $device) = @_; + my ($reading, $value, $unit) = ""; + my @result; + my $hash = $defs{$device}; + + my @parts = split(/: /,$event); + $reading = shift @parts; + $value = join(": ", @parts); + + my $code = $defs{$device}{CODE}; + for my $field (@{$VBUS_devices{$code}->{fields}}) { + my $fieldname = $field->{name}; + my $unit = $field->{unit}; + $unit = "" unless ($unit); + + if ($fieldname eq $reading) { + $value =~ s/\ $unit//; + @result= ($reading,$value,$unit); + last; + } + } + + if (!@result) { + @parts = split(/\ /, $value); + $unit = ""; + if (@parts >= 2) { + $unit = pop(@parts); + $value = join(" ", @parts); + } + @result=($reading, $value, $unit); + } + + return @result; +} + + +sub VBUSDEV_Initialize($) +{ + my ($hash) = @_; + + my @modellist; + foreach my $model (keys %VBUS_devices){ + push @modellist,$VBUS_devices{$model}->{name}; + } + # aa100051771000010a0c5100382204507e01270200571b016000057e35003822056b38223822054638220000012400000000007f42744a00007f0f513301006b0a050001016e, help me! + + # Consumer + #$hash->{Match} = "^aa1000.*"; # trotz Angabe wird ParseMethode auch abweichd des MatchStrings aufgerufen, WARUM? + $hash->{DefFn} = "VBUSDEV_Define"; + $hash->{UndefFn} = "VBUSDEV_Undefine"; + $hash->{ParseFn} = "VBUSDEV_Parse"; + $hash->{DbLog_splitFn} = "VBUSDEV_DbLog_splitFn"; + $hash->{AttrList} = "IODev ".$readingFnAttributes; + $hash->{AttrList} .= " model:" .join(",", sort @modellist); + $hash->{AutoCreate} = { + "VBUSDEV.*" => { +# GPLOT => "power4:Power,", + FILTER => "%NAME", + ATTR => "event-min-interval:.*:120 event-on-change-reading:.*" + } + }; +} + + +sub VBUSDEV_Define($$) +{ + my ($hash, $def) = @_; + my @args = split("[ \t]+", $def); + my $iodev; + my $i = 0; + foreach my $param ( @args ) { + if ($param =~ m/IODev=(.*)/) { + $iodev = $1; + splice( @args, $i, 1 ); + last; + } + $i++; + } + return "Usage: define VBUSDEV " if(@args < 3); + + my ($name, $type, $code, $interval) = @args; + + $hash->{STATE} = 'Initialized'; + $hash->{CODE} = $code; + + AssignIoPort($hash,$iodev) if (!$hash->{IODev}); + if(defined($hash->{IODev}->{NAME})) { + Log3 $name, 3, "$name: I/O device is " . $hash->{IODev}->{NAME}; + } else { + Log3 $name, 1, "$name: no I/O device"; + } + $modules{VBUSDEV}{defptr}{$code} = $hash; + return undef; +} + +sub VBUSDEV_Undefine($$) +{ + my ($hash,$arg) = @_; + my $code = $hash->{CODE}; + $code = $hash->{IODev}->{NAME} ."-". $code if( defined($hash->{IODev}->{NAME}) ); + delete($modules{VBUSDEV}{defptr}{$code}); + return undef; +} + +sub VBUSDEV_Parse($$) +{ + my ($iodev, $msg, $local) = @_; + my $ioName = $iodev->{NAME}; + + + my $dst_addr = substr($msg,4,2).substr($msg,2,2); + my $src_addr = substr($msg,8,2).substr($msg,6,2); + my $protoVersion = substr($msg,10,2); + + my $devtype = $VBUS_devices{$src_addr}; + my $hash = $modules{VBUSDEV}{defptr}{$src_addr}; + + Log3 $hash->{NAME}, 5, "received payload => $msg"; + + return "" if ($msg !~ m/^aa1000/); + + + if ( defined $devtype->{dst_addr} ) { + if ( $devtype->{dst_addr} ne $dst_addr ) { + Log3 $ioName, 3, "skip frame $devtype->{dst_addr} $dst_addr"; + return ""; + } + } + + if(!$hash) { + my $ret = "UNDEFINED VBUSDEV_$src_addr VBUSDEV $src_addr"; + Log3 $ioName, 3, "$ret, please define it"; + DoTrigger("global", $ret); + return ""; + } + + + foreach my $mod (keys %{$modules{VBUSDEV}{defptr}}) { + my $hash = $modules{VBUSDEV}{defptr}{"$mod"}; + $attr{$hash->{NAME}}{model} = $devtype->{name}; + + my $command = substr($msg,14,2).substr($msg,12,2); + my $payload = substr($msg,20); + VBUSDEV_ParsePayload($hash, $devtype, $command, $payload); + + return $hash->{NAME}; + } + return ""; +} + + + +sub VBUSDEV_ParsePayload($@) +{ + my ($hash, $devtype, $cmd, $payload) = @_; + my $name = $hash->{NAME}; + my $devname = $devtype->{name}; + + return undef if ($cmd != $devtype->{cmd}); + + Log3 $hash->{NAME}, 5, "extract payload => $payload"; + + readingsBeginUpdate($hash); + + my $fld = $hash->{READINGS}->{"model"}; + + for my $field (@{$devtype->{fields}}) { + my $fieldname = $field->{name}; + my $val; + my $o = $field->{offset}*2; + + my $bitpos = $field->{bitPos}; + my $bitsize = $field->{bitSize}; + + if ($bitsize<=8) { + $val = substr($payload, $o,2); + } elsif ($bitsize<=16) { + $val = substr($payload, $o+2,2).substr($payload, $o,2); + } elsif ($bitsize<=32) { + $val = substr($payload, $o+6,2).substr($payload, $o+4,2).substr($payload, $o+2,2).substr($payload, $o,2); + } + + #Aenderung: statt: $val = hex($val); um negative Werte anzuzeigen + if ($bitsize == 15) { + $val = unpack('s', pack('S', hex($val))); + } else { + $val = hex($val); + } + #Aenderung ende + + if ($val != 8888) { + if (defined $bitpos) { + $val = $val >> $bitpos; + my $bitmask = ($bitsize == 32) ? 0xffffffff : (1 << $bitsize) - 1; + $val = $val & $bitmask; + } + + $val = $val * $field->{factor} if defined $field->{factor}; + + if ($bitsize==1) { + $val = ($val == 1) ? "on" : "off"; + } + + my $unit = $field->{unit}; + $unit = "" unless ($unit); + + # auf o,5 °C Runden + if ($unit eq "°C") { + $val = ($val >= 0 ? ceil($val*2)/2 : floor($val*2)/2); + } + # Runden ende + $val = $val." ".$unit; # falls keine Unit definiert, muss valaue mit Leerzeichen enden! (siehe VBUSDEV_DbLog_splitFn) + my $fld = $hash->{READINGS}->{$fieldname}; + my $oldval = ""; + $oldval = $fld->{VAL} if ($fld); + + readingsBulkUpdate($hash,$fieldname,$val); # if ($val ne $oldval); + } + } + + readingsEndUpdate($hash, 1); + + return undef; +} +1; + +=pod +=item device +=begin html + + +

VBUSDEV

+
    +
    + + Define +
      + define <name> VBUSDEV <id> [<interval>]
      +
      + Defines an micro-inverter device connected to an ENECSYSGW.

      + Examples: +
        + define MyVbusDevice VBUSDEV 100123456
        +
      +

    + + Readings +
      +
    • The readings are dependant of the model of the VBUS device.

    • +

    +

+=end html +=cut \ No newline at end of file