Zitat von mumpf
Beitrag anzeigen
Ankündigung
Einklappen
Keine Ankündigung bisher.
Message mit 2 byte in 16 bit wandeln
Einklappen
X
-
Hi Martin, sollte kein Vorwurf sein, sondern nur eine Bekräftigung für den Vorschlag von bmx.
Gruß, Waldemar
Einen Kommentar schreiben:
-
Daher hatte ich das im Quellcode schon mal kommentiert. Die eigene Cast Funktion rührt noch aus smarthome.py Zeiten.
Einen Kommentar schreiben:
-
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:
-
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:
Somit ergibt IMHO 0 --> False, 1 --> True, 2...n -> FalseCode:# 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
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:
-
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:
-
Hallo,
das Log sagt bspw. wenn ich eine "3"
wenn ich beim item raumtemp.devices.onewire_gateway.ch1_error.from_kn x eine "3" setze.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
Einen Kommentar schreiben:
-
Hi,
das coding sieht korrekt aus, was sagt denn das Log?
Gruß, Waldemar
Einen Kommentar schreiben:
-
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:
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.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 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:
-
Hi,
noch eine kleine Vereinfachung:
Ist meiner Meinung nach übersichtlicher, ist aber Geschmackssache.Code:eval: "value & 0b00000001" eval_trigger: ..from_knx
Gruß, Waldemar
Einen Kommentar schreiben:
-
Hallo,
die Lösung ist, wie Waldemar mumpf geschrieben hat, das "&".
Danke an alle!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
- Likes 1
Einen Kommentar schreiben:


Einen Kommentar schreiben: