[gelöst] ebusd - Aus Byte ein Bitmuster (einzelne Zustände) decodieren

Begonnen von flmma, 01 November 2018, 10:19:39

Vorheriges Thema - Nächstes Thema

flmma

Hallo,

stehe leider gerade ziemlich auf der Leitung...


von meiner Heizungssteuerung (ELCO Logon M) konnte ich bereits einige für mich wertvolle Werte abfragen, nun scheitere ich aber beim decodieren eines Bytes (Bitmuster von Zuständen):
Byte     Kurzbeschreibung     Langbeschreibung
11        Status                      Bit0: BWR_active
                                           Bit1: Pump release
                                           Bit2: Boiler 1 in operation
                                           ...
                                           Bit6: TBF_connect

Für jedes Bit würde ich gerne einen eigenes Device in FHEM anlegen und den Zustand aktualisieren.
Habe bis jetzt nur broadcast entziffert, meine broadcast.csv sieht für diese Message folgend aus:
b,,Status,Status,,,0801,,kesseltemp,,temp2,,,Kesselisttemp,bwtemp,,temp2,,,Warmwassertemp,emissiontest,,ign:1,,,Emissionstest,heatflags,,BI0;BI1;BI2;BI3;BI4;BI5;BI6,,,Zustand,returnflowtemp,,temp2,,,Ruecklauftemp,,,,,,,,,,,,,,,,,,,,,

Ich denke, dass mein Syntax (fett markierter Teil) in der broadcast.csv für meinen Zweck falsch ist, oder?
Auch der Befehl zum Abfragen eines Bits (ebusctl read Status heatflag:0 ?) ist mir unklar.

Danke für Eure Unterstützung!

lg
Michi




flmma

Hallo,

bin auch für Alternativvorschläge, falls sich das über den EBUSD nicht realisieren lässt, offen.
z.B: Auslesen des Status Dezimal und dann eine Routine, welche die einzelnen Devices setzt,  mit Übergabeparameter (DezimalStatus).

Danke!

lg
Michi

flmma

Hallo,

habe es selbst gelöst, wahrscheinlich nicht die eleganteste Art, aber es funktioniert.
Zur Dokumentation für weitere Suchende

-neues Modul unter /opt/fhem/FHEM/99_myUtils.pm angelegt:
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
   my ($hash) = @_;
}
sub myUtils_DecodeStatus($) {
        my $Rest=0;
        my ($obj) = @_;
        printf("\nin myUtils_DecodeStatus:");
        printf($obj);
    if( $obj >= 64 ){
        fhem( "setstate Warmwasserfuehleract on");
        $Rest = $obj - 64;
        }
    else {
        fhem( "setstate Warmwasserfuehleract off");
        }
    if( $Rest >= 32 ){
        fhem( "setstate Warmwasserladung on");
        $Rest = $Rest - 32;
        }
    else {
        fhem( "setstate Warmwasserladung off");
        }
    if( $Rest >= 16 ){
        fhem( "setstate Ladepumpeact on");
        $Rest = $Rest - 16;
        }
   else {
        fhem( "setstate Ladepumpeact off");
        }
    if( $Rest >= 8 ){
        fhem( "setstate Boiler2act on");
        $Rest = $Rest - 8;
        }
   else {
        fhem( "setstate Boiler2act off");
        }
    if( $Rest >= 4 ){
        fhem( "setstate Boiler1act on");
        $Rest = $Rest - 4;
        }
   else {
        fhem( "setstate Boiler1act off");
        }
    if( $Rest >= 2 ){
        fhem( "setstate Pumpenfreigabe on");
        $Rest = $Rest - 2;
        }
   else {
        fhem( "setstate Pumpenfreigabe off");
        }
    if( $Rest == 1 ){
        fhem( "setstate Warmwassercontrolleract on");
        }
   else {
        fhem( "setstate Warmwassercontrolleract off");
        }
}
1;


Der Aufruf erfolgt per Notify, definiert in der fhem.cfg, folgend:
#Notify für Status aktualisierung
define NewHeatflags notify heatflags {myUtils_DecodeStatus($EVTPART1)}


lg
Michi