[gelöst] ReadingsVal: Dezimal Wert in BitString darstellen ?

Begonnen von ak323, 16 Januar 2017, 22:20:46

Vorheriges Thema - Nächstes Thema

ak323

Hallo zusammen !
Ich bekomme einen ReadingsVal "15" zurück und möchte mir diesen statt als 15 als 16-Bit Bitstring darstellen lassen - also "0000000000001111" 
(-> gibt mir die Schaltzustände von 16 Ausgängen meiner Wärmepumpe an)

Kann mir jemand einen Tipp geben, wie ich das realisieren kann ?
(Suche findet leider nichts)

VG ak323
RaspberryPi 2 im 19" Rack mit 16x2 i2c LCD, FHEM, diverse HomeMatic, 1-Wire (8x DS18B20, 3x DS2408, 2x DS2413, 5x DS2401, DS2423 ATTiny) über DS9490R#, Waterkotte Ai1QE (WWPR) Wärmepumpe über Modbus, WH1080 über Signalduino, 433MHz Funksteckdosen, WiFi RGBWW via Tasmota, ...

Otto123

Hi,

obwohl ich relativ wenig Ahnung davon habe -> $dual = sprintf("%b",$decimal);
Zumindest ergibt {sprintf("%b",15)} -> 1111 in der FHEM Kommandozeile.

Jetzt musst Du bloß noch das Format für 16 bit finden.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Markus Bloch

Einfach nochmal durch sprintf() jagen und als 16 stellige Zahl mit führenden 0'en ausgeben:

sprintf("%016d",sprintf("%b",15))
=>
0000000000001111
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Otto123

Hi Markus,
geht doch noch einfacher  8)
{sprintf("%016b",15)}
betateilchen war schneller  ???
Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Markus Bloch

Verdammt, ich hatte das auch probiert, aber ohne die Null vorneweg  >:(
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

CoolTux


{ sprintf("%016b",ReadingsVal($name,$reading,default)) }


Ich wollte auch mal was schreiben.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

betateilchen


{ sprintf("%016b",ReadingsNum($name,$reading,$default)) }


Es geht schließlich um Zahlen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

CoolTux

Ja Du hast Recht. Wenn dann richtig. Kann ja auch mal Müll drin stehen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ak323

Supi Ihr Spitzen-Experten ... !
Funktioniert 1A ...

Wenn Ihr mir jetzt noch erklärt, wie ich ein einzelnes Bit auslese (z.B. b0), um damit ein Icon anzuzeigen, dann seid Ihr sogar Helden !

Also:
Wenn b0 = 0, Icon Quellenpumpe inaktiv, wenn b0 = 1, Icon Quellenpumpe aktiv.

Danke schonmal .. ak323
RaspberryPi 2 im 19" Rack mit 16x2 i2c LCD, FHEM, diverse HomeMatic, 1-Wire (8x DS18B20, 3x DS2408, 2x DS2413, 5x DS2401, DS2423 ATTiny) über DS9490R#, Waterkotte Ai1QE (WWPR) Wärmepumpe über Modbus, WH1080 über Signalduino, 433MHz Funksteckdosen, WiFi RGBWW via Tasmota, ...

Sany

Hallo ak323,

beim Arduino hatte ich mal damit zu tun, es geht aber auch in Perl. Kurz gesagt: Die Zahl "maskieren" führt zum Ergebnis. Maskieren geht mit einer binären Addition.
Bsp:

              dez       bin
Zahl          6        0110
Maske         4        0100
---------------------------
&(binär Addition)      0100




Ein Versuch nur mit einer Maske hat bei größeren Zahlen nicht immer gestimmt, weshalb folgende Methode besser ist:
Die gewünschte Zahl wird bitweise so weit nach rechts verschoben, bis die gewünschte Stelle ganz rechts steht. Dann wird einfach mit 1 maskiert, also binär addiert und du hast dann 1 oder 0 als Ergebnis. Beim Zählen, wie weit nach rechts verschoben wird, musst du von 0 anfangen. Im Beispiel oben also 2.


4 (0110) >> 2 ergibt 1 (0001), Maske 0001 binär addiert(&) ergibt 1. 3 (0011) >> 2 ergibt 0 (0000), maskiert(&) mit 1 (0001) ergibt 0.


Du musst vorher auch nichts umwandeln, binäres Rechen geht direkt mit den Dezimalzahlen.


Hier ein Dummy zum rumspielen (als RAW direkt zum einfügen)




defmod Waermepumpe dummy
attr Waermepumpe readingList Ausgang Maske
attr Waermepumpe room Test
attr Waermepumpe setList Ausgang:textField Maske:selectnumbers,0,1,15,0,lin
attr Waermepumpe stateFormat einzelBit
attr Waermepumpe userReadings AusgangBIN:Ausgang.* { sprintf("%016b",ReadingsNum($name,"Ausgang",0));; }, einzelBit {(((ReadingsNum($name,"Ausgang",0) >> ReadingsNum($name,"Maske",0)) & 1) == 1)?"on":"off";;}, BINmaske { sprintf("%016b",1 << ReadingsNum($name,"Maske",0));; }
attr Waermepumpe webCmd Ausgang:Maske
attr Waermepumpe webCmdLabel "Zahl 0-65535":"Stelle des Bit 0-15"



Im textfeld Ausgang eine Zahl eintippen und dann ausserhalb des Textfelds klicken, dann wird der Wert übernommen. Dann kannst Du damit rumspielen mit Zahlen, die Deine Wärmepumpe ausspuckt und welches "Bit" du dann auslesen willst. In der Detailansicht siehst Du auch die einzelnen "bits"


Weitere Infos zu den Grundlagen: https://rolfrost.de/bitops.html


Viele Erfolg!
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

ak323

Dake Sany,
japp .. das funktioniert soweit .. jetzt muss es es nur noch an die realen Readings meiner Wärmepumpe angepasst bekommen ...
Werde berichen, wenn ich mal zum Probieren gefunden habe.

VG ak323
RaspberryPi 2 im 19" Rack mit 16x2 i2c LCD, FHEM, diverse HomeMatic, 1-Wire (8x DS18B20, 3x DS2408, 2x DS2413, 5x DS2401, DS2423 ATTiny) über DS9490R#, Waterkotte Ai1QE (WWPR) Wärmepumpe über Modbus, WH1080 über Signalduino, 433MHz Funksteckdosen, WiFi RGBWW via Tasmota, ...

ak323

Hallo Leute, ich muß das Thema  noch mal hochholen, da ich immer noch die 16 Schaltausgänge einzeln darstellen zu versuche ..
Das Listing liefert folgendes:

Internals:
   NAME       WaermepumpeStati
   NR         1264
   STATE      on
   TYPE       dummy
   READINGS:
     2022-01-22 12:57:29   Ausgang         1
     2022-01-22 12:57:29   AusgangBIN      0000000000000001
     2022-01-22 12:57:30   BINmaske        0000000000000001
     2022-01-22 12:57:30   Maske           0
     2022-01-22 12:57:30   einzelBit       on
Attributes:
   group      Wärmepumpe
   readingList Ausgang Maske
   room       TEST
   setList    Ausgang:textField Maske:selectnumbers,0,1,15,0,lin
   stateFormat einzelBit
   userReadings AusgangBIN:Ausgang.* { sprintf("%016b",ReadingsNum($name,"Ausgang",0)); }, einzelBit {(((ReadingsNum($name,"Ausgang",0) >> ReadingsNum($name,"Maske",0)) & 1) == 1)?"on":"off";}, BINmaske { sprintf("%016b",1 << ReadingsNum($name,"Maske",0)); }
   webCmd     Ausgang:Maske
   webCmdLabel "Zahl 0-65535":"Stelle des Bit 0-15"



Der Ausgang ist die Dezimaldarstellung des Ausgangs der Wärmepumpe
AusgangBIN die Umwandlung in 16 bit
BINmaske stellt ein welches Bit betrachtet werden soll (hier das 0, also das ganz rechte)
einzelBit zeigt mit "on", daß es auf 1 steht

Jetzt möchte ich für jedes der Bits ein Dummy definieren, welches den Status der jeweiligen Bits darstellt.
Das hier funktioniert leider trotz viele Versuche nicht:

define WaermepumpeStatiBit0 dummy
attr WaermepumpeStatiBit0 devStateIcon off:sani_pump@orange on:sani_pump
attr WaermepumpeStatiBit0 event-on-change-reading .*
attr WaermepumpeStatiBit0 group Wärmepumpe
attr WaermepumpeStatiBit0 room TEST
attr WaermepumpeStatiBit0 stateFormat 1
attr WaermepumpeStatiBit0 userReadings AusgangBINBit0:Ausgang.* { sprintf("%016b",ReadingsNum($name,"Ausgang",0));; }, einzelBit {(((ReadingsNum($name,"Ausgang",0) >> ReadingsNum($name,0,0)) & 1) == 1)?"on":"off";;}, BINmaske { sprintf("%016b",1 << ReadingsNum($name,0,0));; }


-> hier habe ich Maske auf 0 gesetzt, weil nicht ja das ganz rechte Bit interessiert, ... entsprechen 1, 2, 3 bei den weiteren war meine Vorstellung ..

Kann mir bitte noch mal jemand "auf die Sprünge" helfen ?

Danke nochmals, ak323
RaspberryPi 2 im 19" Rack mit 16x2 i2c LCD, FHEM, diverse HomeMatic, 1-Wire (8x DS18B20, 3x DS2408, 2x DS2413, 5x DS2401, DS2423 ATTiny) über DS9490R#, Waterkotte Ai1QE (WWPR) Wärmepumpe über Modbus, WH1080 über Signalduino, 433MHz Funksteckdosen, WiFi RGBWW via Tasmota, ...

Otto123

#13
Du meinst sowas? 16 Dummies waren mir zuviel. Ich habe es mal zu Fuß in 16 Readings verpackt. Kann man sicher besser machen.
Den Ursprung einzelBit, BINMaske und Maske habe ich mal drin gelassen, der ist eigentlich obsolete
defmod Waermepumpe dummy
attr Waermepumpe readingList Ausgang Maske
attr Waermepumpe room TEST
attr Waermepumpe setList Ausgang:textField Maske:selectnumbers,0,1,15,0,lin
attr Waermepumpe stateFormat einzelBit
attr Waermepumpe userReadings AusgangBIN:Ausgang.* { sprintf("%016b",ReadingsNum($name,"Ausgang",0));; }, \
einzelBit {(((ReadingsNum($name,"Ausgang",0) >> ReadingsNum($name,"Maske",0)) & 1) == 1)?"on":"off";;},\
einzel00 {(((ReadingsNum($name,"Ausgang",0) >> 0) & 1) == 1)?"on":"off";;},\
einzel01 {(((ReadingsNum($name,"Ausgang",0) >> 1) & 1) == 1)?"on":"off";;},\
einzel02 {(((ReadingsNum($name,"Ausgang",0) >> 2) & 1) == 1)?"on":"off";;},\
einzel03 {(((ReadingsNum($name,"Ausgang",0) >> 3) & 1) == 1)?"on":"off";;},\
einzel04 {(((ReadingsNum($name,"Ausgang",0) >> 4) & 1) == 1)?"on":"off";;},\
einzel05 {(((ReadingsNum($name,"Ausgang",0) >> 5) & 1) == 1)?"on":"off";;},\
einzel06 {(((ReadingsNum($name,"Ausgang",0) >> 6) & 1) == 1)?"on":"off";;},\
einzel07 {(((ReadingsNum($name,"Ausgang",0) >> 7) & 1) == 1)?"on":"off";;},\
einzel08 {(((ReadingsNum($name,"Ausgang",0) >> 8) & 1) == 1)?"on":"off";;},\
einzel09 {(((ReadingsNum($name,"Ausgang",0) >> 9) & 1) == 1)?"on":"off";;},\
einzel10 {(((ReadingsNum($name,"Ausgang",0) >> 10) & 1) == 1)?"on":"off";;},\
einzel11 {(((ReadingsNum($name,"Ausgang",0) >> 11) & 1) == 1)?"on":"off";;},\
einzel12 {(((ReadingsNum($name,"Ausgang",0) >> 12) & 1) == 1)?"on":"off";;},\
einzel13 {(((ReadingsNum($name,"Ausgang",0) >> 13) & 1) == 1)?"on":"off";;},\
einzel14 {(((ReadingsNum($name,"Ausgang",0) >> 14) & 1) == 1)?"on":"off";;},\
einzel15 {(((ReadingsNum($name,"Ausgang",0) >> 15) & 1) == 1)?"on":"off";;},\
BINmaske { sprintf("%016b",1 << ReadingsNum($name,"Maske",0));; }
attr Waermepumpe webCmd Ausgang:Maske
attr Waermepumpe webCmdLabel "Zahl 0-65535":"Stelle des Bit 0-15"
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

ak323

#14
Hmmm.. danke Otto123, ...
genau so .... !

Jetzt kann ich die einzelnen Readings entsprechend weiterverarbeiten ...
DANKE !

##################################
Readings
Ausgang
4
2022-01-22 16:02:18
AusgangBIN
0000000000000100
2022-01-22 16:02:18
BINmaske
0000000000000001
2022-01-22 16:02:18
Maske
0
2022-01-22 15:59:59
einzel00
off
2022-01-22 16:02:18
einzel01
off
2022-01-22 16:02:18
einzel02
on
2022-01-22 16:02:18
einzel03
off
2022-01-22 16:02:18
einzel04
off
2022-01-22 16:02:18
einzel05
off
2022-01-22 16:02:18
einzel06
off
2022-01-22 16:02:18
einzel07
off
2022-01-22 16:02:18
einzel08
off
2022-01-22 16:02:18
einzel09
off
2022-01-22 16:02:18
einzel10
off
2022-01-22 16:02:18
einzel11
off
2022-01-22 16:02:18
einzel12
off
2022-01-22 16:02:18
einzel13
off
2022-01-22 16:02:18
einzel14
off
2022-01-22 16:02:18
einzel15
off
2022-01-22 16:02:18
einzelBit
off
2022-01-22 16:02:18
RaspberryPi 2 im 19" Rack mit 16x2 i2c LCD, FHEM, diverse HomeMatic, 1-Wire (8x DS18B20, 3x DS2408, 2x DS2413, 5x DS2401, DS2423 ATTiny) über DS9490R#, Waterkotte Ai1QE (WWPR) Wärmepumpe über Modbus, WH1080 über Signalduino, 433MHz Funksteckdosen, WiFi RGBWW via Tasmota, ...