Da ich aktuell Urlaub und somit wieder Zeit zum Basteln habe, versuche ich ein wenig mit dem Buderus EMS Gateway herumzuspielen.
Es kommen Hexwerte an, die 8 Datenbits abbilden. Mit base_convert() kann ich zwar in Binär umwandeln, aber wenn als Hexwert „04“ an kommt, dann kommt als Ergebnis: 100
Gibt es eine Möglichkeit diesen Wert auch komplett abzubilden, also: 00000100 ??
(In dem Beispiel ist das 3. Bit gesetzt und bedeutet das die Automatik an ist.)
Ziel ist es eigentlich nur, die Bits auszuwerten um sie den einzelnen Variablen zuordnen zu können.
Hat jemand eine Idee wie man das unkompliziert umsetzen kann ?
vielen Dank.
An so etwas hatte ich zuerst auch schon gedacht, war mir aber nicht sicher ob das zielführend ist.
Die Hoffnung war etwas geniales zu finden, mit dem auch gleichzeitig die Variablen gefüllt werden können. Aber so kann ich jetzt zumindest schon mal die einzelnen Stellen auswerten.
du kannst du doch mit der Funktion mit 2 Zeilen das umwandeln und direkt in eine Variable speichern oder sonstwas damit anstellen. Einfacher geht doch nicht!? Oder was hast du dir genau vorgestellt? Dann musst du etwas genauer werden
@Christian: Danke für die Funktion, brauche die zwar aktuell nicht, aber irgendwann bestimmt mal - also gespeichert
wie schon gesagt ist der Hexwert die Zusammenfassung von 8 Einzelwerten und somit der Zustand von 8 Variablen.
Wie lautet der Zweizeiler um alle 8 Variablen zu aktualisieren ?
Ich kenne dein komplettes Skript nicht, denn du hast es nicht geposted, obwohl es immer hilfreich wäre das Skript des Fragestellers zu kennen…
…aber du musst ja zwangsweise immer mal eine Zeile haben wo du deine jetzigen Variablen/Werte „anfasst“…!?
…jage sie doch da direkt durch die Funktion und schon haste es umgerechnet und kannst weitermachen wie bisher, nur in binär?!
?? Wo steht etwas von einem existierenden Script?
Bisher gibt es kein Script, daher habe ich auch keins gepostet !?
Was bislang existiert ist ein Hexwert, den ich mit base_convert() in Binär umrechne, siehe Beispiele im Startpost.
Mit der Funktion von Christian wird das Ergebnis lediglich mit Nullen auf gesamt 8 Stellen aufgefüllt.
Somit habe ich wie bisher eine Variable mit einem Stringwert … Am einfachsten wäre jetzt sicher etwas wie explode(), aber das geht ja auf Grund fehlendem Trennzeichen nicht. Daher die Frage nach einer Idee hier im Forum.
Zur Erklärung:
base_convert wandelt den ursprünglichen $hexwert in Binär um.
str_pad() füllt bei Bedarf den Binärwert von links mit Nullen auf insgesamt 8 Stellen auf.
str_split() zerlegt dann den Binärwert nach jeder Stelle und macht daraus ein Array
Hehe, ich mag das IPS Forum Viele coole Leute hier unterwegs Gutes Skript Michael, so meinte ich das
Aber…tetrapack…man muss auch bedenken, dass kürzer nicht immer gleich besser ist
> Wichtig ist doch eigentlich die Laufzeit des Skriptes!? Also kann unter umständen ein Skript mit 20 Zeilen schneller sein als ein Skript mit 7 Zeilen. Wenn du also extremen Wert auf Schnelligkeit legst, dann kannst du ja mal die Zeit des Skriptes messen und die kurze Variante von Michael mit einer langen Variante mit einzelner Variablenprüfung ohne for oder mit Funktion oder wie auch immer gegenüberstellen
Beispiel:
<?
$beginn = microtime(true);
// IPS_Sleep(2000);
// irgendwelche Befehle von denen man die Zeit stoppen möchte
$dauer = microtime(true) - $beginn;
echo "Skript-Laufzeit: ".$dauer." Sekunden!";
?>
Es gibt eine einfache Möglichkeit indem du deinen hex Wert mit dem hex Wert für jedes Bit logisch UND verknüpfst. Da gab es hier im Forum mal eine Variante mit INT um aus einem Siemens ausgangsbyte die Zustände der Bits auf Variablen zu schreiben. Ist die UND Verknüpfung größer 0 ist das Bit gesetzt. Ich bin grad nicht am PC aber wenn Interesse besteht poste ich mal meinen Ansatz.