Script: Bit Maniqulation

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Benutzeravatar
stan23
Beiträge: 2038
Registriert: 13.12.2016, 21:14
System: Alternative CCU (auf Basis OCCU)
Wohnort: Altmühltal
Hat sich bedankt: 582 Mal
Danksagung erhalten: 336 Mal
Kontaktdaten:

Re: Script: Bit Maniqulation

Beitrag von stan23 » 20.08.2021, 19:26

Ich hatte ehrlich gesagt das Beispiel nicht nachgerechnet.

Code: Alles auswählen

integer mask;
integer value;

value = 48; ! 48 = 0x30 = 0b0011.0000
WriteLine("Ausgangswert: " # value);

! Bit 2 setzen
mask = 4; ! 4 = 0x04 = 0b0000.0100
value = value | mask;
WriteLine("Bit 2 (mask " # mask # ") set! value = " # value);
! => 52 = 0x34 = 0b0011.0100

! Bit 2 löschen
mask = 255 - 4; ! = 251 = 0xFB = 0b1111.1011
value = value & mask;
WriteLine("Bit 2 (mask " # mask # ") reset! value = " # value);
! => 48 = 0x30 = 0b0011.0000
Ausgabe:
Ausgangswert: 48
Bit 2 (mask 4) set! value = 52
Bit 2 (mask 251) reset! value = 48
Wichtig ist bei der Maske zum Rücksetzen der Bits daran zu denken, dass die 0 das dominante Element der bitweisen Ver-Undung ist.
Viele Grüße
Marco

RaspberryMatic als VM auf einem NUC mit Proxmox und USB-Funkmodul
~80 Geräte (HM, HmIP, HMW, HBW, AskSin)

Benutzeravatar
Black
Beiträge: 5472
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1071 Mal
Kontaktdaten:

Re: Script: Bit Maniqulation

Beitrag von Black » 21.08.2021, 08:30

HubiBr hat geschrieben:
20.08.2021, 17:33
Hallo,
dieses Beispiel kenne ich schon, aber es funktioniert nicht richtig, falls es jemand schon mal probiert hat.
Hier meine Ergebnisse laut Beispiel:

integer value= 48; ! => 0011 0000
! Bit Setzen
value= value | 4;
WriteLine("Set BIT " # value); ! => 52, 00110100

! Bit löschen
value = value & 47;
WriteLine("Del BIT " # value); ! => 36, 0010 0100

Beim zurücksetzen sollte doch zu mindestens wieder 52 herauskommen ?

Zu der Frage was mein Ziel ist, ich muß mehre Statusflags verwalten, wenn ich das über einzelne boolean Flags (16x) mache bekomme einen unübersichtlichen Code.

VG
hubiB
es würde funktionieren, wenn du zum löschen des Bit 2 (Dez 4) die richtige Binärmaske benutzt hättest.

zum Setzen ist |4 richtig zum löschen brauchst du aber (wenn du in einem byte Maskierst) 255-Setzmaske. Heisst value=value & 251;

(benötigte Maske: 1111 1011 = 251)

hmm, ob ich jetz zum Frühstück schon ein Weizen aus dem Kühlschrank hole ?

deine 47 wiederrum sind: 0010 1111 und damit ist dein falsches Ergebnis klar

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

HubiBr
Beiträge: 7
Registriert: 15.08.2021, 18:48
System: CCU

Re: Script: Bit Maniqulation

Beitrag von HubiBr » 21.08.2021, 10:45

Hallo Marco,
danke für das korrigierte Beispiel, es funktioniert jetzt richtig. :D

Hatte mich leider verschrieben "Beim zurücksetzen sollte doch zu mindestens wieder 52 herauskommen" ich meinte natürlich 48 :D

Hallo Black,
danke für deinen Kommentar, ich habe mich hier nur auf vorhandene Beispiel bezogen, da ich auf diese verwiesen wurde und das hat ja nicht gepasst.
Na dann prost :D



Jetzt stellt sich noch die Frage wie kann man prüfen ob das Bit gesetzt ist ? Shift Operationen scheinen ja leider nicht zu funktionieren.

integer mask;
integer value;

value = 48; ! 48 = 0x30 = 0b0011.0000
WriteLine("Ausgangswert: " # value);

! Bit 2 setzen
mask = 4; ! 4 = 0x04 = 0b0000.0100
value = value | mask;
WriteLine("Bit 2 (mask " # mask # ") set! value = " # value);
! => 52 = 0x34 = 0b0011.0100

!Bit prüfen ob gesetzt
if (value & (1 << mask)) ! <== Funktioniert leider nicht ?
WriteLine("Bit 2 is set");

! Bit 2 löschen
mask = 255 - 4; ! = 251 = 0xFB = 0b1111.1011
value = value & mask;
WriteLine("Bit 2 (mask " # mask # ") reset! value = " # value);
! => 48 = 0x30 = 0b0011.0000

Vielleicht gibt es noch eine Idee wie man shiften bzw. Bit prüfen kann ?

Viele Grüße
hubiB

MichaelN
Beiträge: 9656
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1617 Mal

Re: Script: Bit Maniqulation

Beitrag von MichaelN » 21.08.2021, 11:00

Bin kein Bit Schubser, aber kann man nicht einfach mit einer Maske alle anderen Bit Auf 0 setzen und dann prüfen ob das Ergebnis größer null ist?
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

HubiBr
Beiträge: 7
Registriert: 15.08.2021, 18:48
System: CCU

Re: Script: Bit Maniqulation

Beitrag von HubiBr » 21.08.2021, 11:12

Hallo Michael,

ich möchte ja wissen welches Bit gesetzt ist, und nicht ob irgend ein Bit verändert wurde.
Falls ich deinen Kommentar hier falsch interpretiert habe, schreibe doch bitte mal ein Beispiel hierzu.

Viele Grüße

hubiB

MichaelN
Beiträge: 9656
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1617 Mal

Re: Script: Bit Maniqulation

Beitrag von MichaelN » 21.08.2021, 11:42

HubiBr hat geschrieben:
21.08.2021, 10:45
Jetzt stellt sich noch die Frage wie kann man prüfen ob das Bit gesetzt ist ?
Dann habe ich deine Frage wohl falsch verstanden.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Benutzeravatar
Black
Beiträge: 5472
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1071 Mal
Kontaktdaten:

Re: Script: Bit Maniqulation

Beitrag von Black » 21.08.2021, 12:11

Bits abfragen ist auch Maskieren auf das Bit und Abfrage auf 0 bzw nicht 0

Bits.PNG

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

dondaik
Beiträge: 12925
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1599 Mal
Danksagung erhalten: 222 Mal

Re: Script: Bit Maniqulation

Beitrag von dondaik » 21.08.2021, 13:35

wieso ist der code für 16 SV unübersichtlich ? für mich nur klar lesbar doch xxx wege nach rom :mrgreen:
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

Antworten

Zurück zu „HomeMatic allgemein“