Ankündigung

Einklappen
Keine Ankündigung bisher.

Message mit 2 byte in 16 bit wandeln

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Msinn
    antwortet
    Zitat von mumpf Beitrag anzeigen
    Hi Martin, sollte kein Vorwurf sein, sondern nur eine Bekräftigung für den Vorschlag von bmx.
    Hatte ich auch nicht so verstanden. Ich wollte nur erläutern woher das kommt.

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Hi Martin, sollte kein Vorwurf sein, sondern nur eine Bekräftigung für den Vorschlag von bmx.

    Gruß, Waldemar

    Einen Kommentar schreiben:


  • bmx
    antwortet
    Wenn es keine Einwände gibt, dann sollten wir mit dem nächsten Release die Umwandlung Python erwartungskonform ändern wie damals schon von Msinn notiert.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Daher hatte ich das im Quellcode schon mal kommentiert. Die eigene Cast Funktion rührt noch aus smarthome.py Zeiten.

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Hi,

    danke für die Erklärung. Mir war nicht klar, dass es hier eine eigene cast-Funktion gibt, ich ging davon aus, dass das Standardverhalten hier gelten würde.
    Ich bin sicherlich kein python-Profi, aber bool(2) ist True, bool(0) ist False... In einem if wird der Ausdruck ja dementsprechend ausgewertet. Ich finde es auch nicht erwartungskonform, dass ein bool von einem int > 1 nicht True wird.

    Gruß, Waldemar

    Einen Kommentar schreiben:


  • bmx
    antwortet
    Das Ergebnis vom Ausdruck den Waldemar ins Spiel gebracht hat, ist immer ein Integer. In lib/item.py findet sich die Ursache für das Verhalten und auch eine ToDo Anmerkung:

    Code:
    # TODO: Candidate for Utils.to_bool()
    # write testcase and replace
    # -> should castng be restricted like this or handled exactly like Utils.to_bool()?
    #    Example: _cast_bool(2) is False, Utils.to_bool(2) is True
    
    def _cast_bool(value):
        if type(value) in [bool, int, float]:
            if value in [False, 0]:
                return False
            elif value in [True, 1]:
                return True
            else:
                raise ValueError
        elif type(value) in [str, str]:
            if value.lower() in ['0', 'false', 'no', 'off', '']:
                return False
            elif value.lower() in ['1', 'true', 'yes', 'on']:
                return True
            else:
                raise ValueError
        else:
            raise TypeError
    Somit ergibt IMHO 0 --> False, 1 --> True, 2...n -> False

    Ich wäre dafür, das hier wie in Utils.to_bool() zu ändern. Sprich alles was nicht 0 ist auf True und 0 auf False.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Ok, danke.

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Sorry,

    dann hab ich Dir was falschen empfohlen... Es sollte auch   "(value & 0b00001000) != 0"  gehen, ist etwas kürzer. Aber mach wie Du denkst.

    Gruß, Waldemar

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    mumpf

    Es liegt am eval.

    Nutzt man
    Code:
    "True if value & 0b00001000 else False"
    geht es, nutzt man
    Code:
    "value & 0b00001000"
    geht es nicht, bzw. kommt dann nur der erste fehlerhafte Sensor an.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Hallo,

    das Log sagt bspw. wenn ich eine "3"
    Code:
    2019-08-05  22:23:23 WARNING  raumtemp.devices.onewire_gateway.ch1_error.sensor2_error Item raumtemp.devices.onewire_gateway.ch1_error.sensor2_error: value "2" does not match type bool. Via Eval raumtemp.devices.onewire_gateway.ch1_error.from_knx
    wenn ich beim item raumtemp.devices.onewire_gateway.ch1_error.from_kn x eine "3" setze.

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Hi,

    das coding sieht korrekt aus, was sagt denn das Log?

    Gruß, Waldemar

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Hallo,
    ich muss das nochmal aufwärmen, denn die Fehlermeldung bei mehreren Defekten klappt noch nicht.

    Es geht um das Fehlermeldungen des Konnekting 1w Gateways. Das Gateway bietet 3 Kanäle mit je je 14 Sensoren.
    Die Errormessage ist pro Kanal eine DPT7 (16bit unsigned). Dabei repäsentieren die 16 Stellen von rechts beginnend die Sensoren (1. Stelle von rechts -> Sensor 1, usw). An der Stelle mit "1" ist der Sensor fehlerhaft.

    Beispiele:
    • 0000001000 --> die "1" steht an 4. Stelle -> der Sensor4 hat einen Error.
    • Sensor 2 und Sensor 5 und Sensor 10 haben einen Fehler, dann wird eine Nachricht geschickt die so aussieht: 1000010010 --> an der zweiten, fünften und zehnten Stelle (von rechts) steht eine "1"

    Die aktuelle Implementierung ist:
    Code:
    onewire_gateway:
                type: foo
                alive:
                    type: bool
                    knx_dpt: 1
                    knx_cache: 0/3/143
                ch1_error:
                    type: bool
                    eval: or
                    eval_trigger:
                      - .sensor1_error
                      - .sensor2_error
                      - .sensor3_error
                      - .sensor4_error
                      - .sensor5_error
                      - .sensor6_error
                      - .sensor7_error
                      - .sensor8_error
                      - .sensor9_error
                      - .sensor10_error
                      - .sensor11_error
                      - .sensor12_error
                      - .sensor13_error
                      - .sensor14_error
                    from_knx:
                        type: num
                        knx_dpt: 7
                        knx_cache: 0/3/136
                    sensor1_error:
                        type: bool
                        eval: "value & 0b00000001"
                        eval_trigger: ..from_knx
                    sensor2_error:
                        type: bool
                        eval: "value & 0b00000010"
                        eval_trigger: ..from_knx
                    sensor3_error:
                        type: bool
                        eval: "value & 0b00000100"
                        eval_trigger: ..from_knx
                    sensor4_error:
                        type: bool
                        eval: "value & 0b00001000"
                        eval_trigger: ..from_knx
                    sensor5_error:
                        type: bool
                        eval: "value & 0b00010000"
                        eval_trigger: ..from_knx
                    sensor6_error:
                        type: bool
                        eval: "value & 0b00100000"
                        eval_trigger: ..from_knx
                    sensor7_error:
                        type: bool
                        eval: "value & 0b01000000"
                        eval_trigger: ..from_knx
                    sensor8_error:
                        type: bool
                        eval: "value & 0b10000000"
                        eval_trigger: ..from_knx
                    sensor9_error:
                        type: bool
                        eval: "value & 0x100"
                        eval_trigger: ..from_knx
                    sensor10_error:
                        type: bool
                        eval: "value & 0x200"
                        eval_trigger: ..from_knx
                    sensor11_error:
                        type: bool
                        eval: "value & 0x400"
                        eval_trigger: ..from_knx
                    sensor12_error:
                        type: bool
                        eval: "value & 0x800"
                        eval_trigger: ..from_knx
                    sensor13_error:
                        type: bool
                        eval: "value & 0x1000"
                        eval_trigger: ..from_knx
                    sensor14_error:
                        type: bool
                        eval: "value & 0x2000"
                        eval_trigger: ..from_knx
    Wie gesagt, es funktioniert nicht richtig, wenn mehrere Sensoren defekt sind. Vom knx kommt bspw "3" in dezimalt, was in binär 16bit unsigned "00000000 00000011" bedeutet, also Sensor 1 und 2 sind fehlerhaft, Sensoren 3-14 fehlerfrei.

    Wie bekomme ich das in Python bzw. shNG aufgelöst, so dass ich die aus der Fehlermeldung die entsprechenden Sensoren auslesen kann?
    Danke Euch.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    mumpf
    Nehme ich gern mit auf. DANKE

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Hi,

    noch eine kleine Vereinfachung:
    Code:
    eval: "value & 0b00000001"
    eval_trigger: ..from_knx
    Ist meiner Meinung nach übersichtlicher, ist aber Geschmackssache.

    Gruß, Waldemar

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Hallo,
    die Lösung ist, wie Waldemar mumpf geschrieben hat, das "&".

    Code:
    %YAML 1.1
    ---
    raumtemp:
        devices:
            type: foo
            onewire_gateway:
                type: foo
                ch1_error:
                    type: bool
                    from_knx:
                        type: num
                        knx_dpt: 7
                        knx_listen: 0/3/136
                    sensor1_error:
                        type: bool
                        eval: "True if value & 0b00000001 else False"
                        eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
                    sensor2_error:
                        type: bool
                        eval: "True if value & 0b00000010 else False"
                        eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
                    sensor3_error:
                        type: bool
                        eval: "True if value & 0b00000100 else False"
                        eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
                    sensor4_error:
                        type: bool
                        eval: "True if value & 0b00001000 else False"
                        eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
    Danke an alle!

    Einen Kommentar schreiben:

Lädt...
X