Script: Bit Maniqulation

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

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

Script: Bit Maniqulation

Beitrag von HubiBr » 19.08.2021, 20:56

Hallo liebe Gemeinde,
hat sich jemand schon mal mit Bit Maniqulation im Homematic Script beschäftigt ?
Ich möchte gerne z.B. bei einer 16 Bit integer Variable die einzelnen Bits setzen bzw. zurücksetzen (0000 0000 1010 1010 ) und den Zustand der gesetzten Bits über eine if() Bedingung abfragen.
Über ein funktionierendes Beispiel würde ich mich freuen.

Viele Grüße
HubiB

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

Re: Script: Bit Maniqulation

Beitrag von dondaik » 19.08.2021, 22:11

Hallo,
gut wäre es die eigenen ansätze zu zeigen ..
-------
!!! 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.

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: Script: Bit Maniqulation

Beitrag von jp112sdl » 19.08.2021, 22:50

HubiBr hat geschrieben:
19.08.2021, 20:56
den Zustand der gesetzten Bits über eine if() Bedingung abfragen.
Soweit ich weiß, geht das nur dezimal; binäre Darstellung geht in HM Skript nicht.

Code: Alles auswählen

integer a = 11;
if (a & 1) ...  ! ist true
if (a & 2) ...  ! ist true
if (a & 4) ...  ! ist false
if (a & 8) ...  ! ist true
Könnte man dann natürlich sinniger Weise mit einer while Schleife machen
HubiBr hat geschrieben:
19.08.2021, 20:56
einzelnen Bits setzen bzw. zurücksetzen
Geht dann auch nur dezimal.
Zurücksetzen z.B. if (a & 8 ) { a = a - 8;}
bzw. umgekehrt das Setzen if ((a&8)==false) { a = a + 8;}

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

dtp
Beiträge: 10660
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 321 Mal
Danksagung erhalten: 501 Mal

Re: Script: Bit Maniqulation

Beitrag von dtp » 20.08.2021, 09:34

Einen ersten Ansatz könnte auch das hier liefern.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

MichaelN
Beiträge: 9679
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

Re: Script: Bit Maniqulation

Beitrag von MichaelN » 20.08.2021, 10:00

Das ist ein gutes Beispiel dafür, daß man mit mehr Informationen sinnvollere Lösungen liefern könnte.
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 » 20.08.2021, 16:34

Hallo liebe Gemeinde,
danke für die bisherige Antworten, wie ich sehe und vermutet habe geht es leider nicht binär :-(. Obwohl der Ansatz laut Handbuch mit der Verundung oder Veroderung zum Setzen und löschen von Bits gegeben wäre. So eine binäre Statusvariable wäre durchaus sinnvoll, wenn man mehre Status Flags setzen bzw. zurücksetzen und danach abfragen will. Dadurch könnte man z.B. 16 Flags in einer integer Variable verwalten.
Vielleicht gibt es einen Ansatz dieses zu implementieren oder ein funktionierendes Beispiel ?

Viele Grüße
hubiB

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

Re: Script: Bit Maniqulation

Beitrag von stan23 » 20.08.2021, 16:55

Bitweises Testen hat Jérôme doch im dritten Beitrag gezeigt, und das Setzen und Rücksetzen hat Black hier beschrieben:
Black hat geschrieben:
09.07.2018, 23:14
Integer wäre recht einfach:

integer value= 48; !110000
value= value | 4; ! Setzt bit nummer 2 (2^2) 110010
value = value & 47; ! Setzt bit nummer 4 (2^4=16) zurück 100010 (maske 47= 101111)
Einzig das ^ (bitweise Invertierung) würde ich in ReGa Skript vermissen, aber ansonsten ist doch alles da?
Viele Grüße
Marco

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

MichaelN
Beiträge: 9679
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

Re: Script: Bit Maniqulation

Beitrag von MichaelN » 20.08.2021, 16:59

Und was ist dein Ziel? Speicherplatz sparen?
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 » 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

MichaelN
Beiträge: 9679
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

Re: Script: Bit Maniqulation

Beitrag von MichaelN » 20.08.2021, 17:46

Und wie wäre es mit durch ; getrennte Strings, die du mit den Web befehlen verarbeitest?
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 +++

Antworten

Zurück zu „HomeMatic allgemein“