Integer Wert zu Unix Timestamp

Moin,

ich hab ein leines Problem, einen integerwert in einen UnixTimestamp zu verwandeln. Meine Hardware liefert mir einen 3 byte zeitstempel in einer ungewähnlichen form.
es kommt zum beispiel 0x0064. Das bedeutet decodiert als String über unpack(‚v‘, $Value)[1]; dann 100 und steht für (01:00 Uhr).
Kommt zum beispiel vom Gerät 0x01F4 dann sind das 0500 und das steht für 5:00Uhr usw.
Leider bin ich in PHP nicht sonderlich gut und stelle mir nun die Frage, wie ich 0x01F4 in einen 5:00 Uhr Unix Zeitstempel bekomme, der ja dann irgendwie 18000 sei müsste bzw beim 01:00 Uhr Wert 3600.

Falls du wirklich Stunden und Minuten hast (keine Sekunden) dann:

$a=0x1f4;
$h=intval($a/100);
$min=$a%100;
$zeitstempel=$h*3600+$min*60;

Gruß Thomas

1 „Gefällt mir“

Nein hab keine Sekunden. ich probiere das heute Abend, nach der Arbeit mal aus.

Geht leider doch nicht so einfach. Die vorgelagerte Instanz gibt mir die Werte als string aus. leider zeigt mir die Debugausgabe von IPS nict den typ an. Es sind auf jkeden Fall zwei byte und wenn ich es als „Text“ anzeigen lasse, sieht es so aus.
text
Als Text(Roh) sieht es so aus
text roh
und wenn ich Hex als Darstellung wähle dann so
Hex

An die Funktion, die ich zum Konvertieren verwende wird es als String übergeben.
private function ConvertValue(array $Variable, string $Value)

Zwei Zeichen in eine Ganzzahl (int) kannst du mit unpack umwandelt:

$Data = "\xF4\x01";
$a = unpack('v',$Data)[1];
$h=intval($a/100);
$min=$a%100;
$zeitstempel=$h*3600+$min*60

Klar kann das Debug keinen Typ darstellen, es sind ja immer Strings mit darin enthaltenen Zeichen.
Aber die Darstellung als Text oder HEX kannst du selber umstellen.
Michael

Danke das funktioniert zumindest eingeschränkt. eingschränkt deshalb, weil der resultierende ~UnixTimestampTime einen Versatz von einer Stunde hat (kann ich aber durch subtrahieren von 3600 wieder korrigieren) und zum Zweiten, weil die Zeit 01:00:00 in einem integerwert 0 mündet nur als „-“ angezeigt wird.

Ein Integerwert von 1 ergibt 01:00:01, ein INtegrwert von -1 ergibt 00:59:59 und ein Wert von 0 wird nur als Strich abgebildet.

Das liegt an der Anzeige in Symcon, hier wird die locale Uhrzeit berücksichtigt.
Der Wert selbst ist aber korrekt.
Im Sommer hast du dann zwei Stunden Versatz.
Michael

Ok, also ist der UnixTimestamp immer UTC. OK das kann ich korrigieren. Warum aber 01:00:00 als „-“ angezeigt wird erschließt sich mir nicht.

Gut, das Auslesen der Werte über Modbus klappt jetzt und sie werden alle in die entsprechenden Variablen des Moduls geschrieben.
jetzt habe ich aber ein paar Variablen, die ich auch shcreiben kann. Diese Werte müssen dann bei Änderung der vAriablen auch über den Modbus an den Wechselrichter gesendet werden. Das Senden der $Data würde ich mit

    $Value = $this->SendDataToParent(json_encode(Array("DataID" => "{E310B701-4AE7-458E-B618-EC13A1A6F6A8}", "Function" => 0x10, "Address" => $Start , "Quantity" => 2, "Data" => $Data));

erledigen. Mir fehlt aber, da es mein erstes Modul ist das Versändnis, wie das Modul die Variablenänderung mitbekommt und dann eben genau diese Funktion auslöst. Muss ich da zu jeder Variable die geändert werden kann ein Event registrieren, das bei Variablenänderung ausgelöst wird und wenn ja, wie mache ich das.

Das wäre eine Frage für #erweiterungen:php-module-entwicklung .
Hat auch nichts direkt mit dem Thema hier zu tun, weil die Funktion im SDK ist immer gleich.

Michael

Ich muss doch nochmal nachhaken, da ich es partout nicht schaffe sinnvolle Werte über den Modbus Gateway an den Deye Wechselrichter zurück zu senden. Die oben schon erwähnte Funktion

$Resp = $this->SendDataToParent(json_encode(Array("DataID" => "{E310B701-4AE7-458E-B618-EC13A1A6F6A8}", "Function" => 0x10, "Address" => $Start , "Quantity" => 1, "Data" => $str)));
            

tut nicht, was ich von ihr erwarten bzw. beim Deye kommen auf der korrekten Adresse völlig unsinnige Werte an . Ich geh mal davon aus, dass es sich um einen Fehler im Datentyp handelt, der irgendwie falsch übersetzt wird. Welchen Datentyp erwartet dieser Aufruf in der Variable $str?

Wenn ich das Ganze in einer Modbus Device Instanz mache, dann klappt es.
Nehmen wir mal an ich will den Wert 10 auf Adresse 168 schreiben, dann schaut das so aus und geht.


Mache ich das über die Funktion, so steht bei mir hinterher im Register ein Wert von 12592. Das sind 0x3130 und 31 30 sind die ASCI Zeichen für die beiden Buchstaben „10“ die ich eigentlich als Wert da drin haben wollte.
Ich weiß, ich stell mich vielleicht zu blöde an, aber ich steh gerade voll auf dem Schlauch.

Du musst natürlich den Wert wieder mit Pack in einen binären String packen.
Sonst werden da die ASCII Zeichen für 10 gesendet :slight_smile:
Michael

Als ob ich das nicht schon versucht hätte.

$str = pack('s',$Value); 
$this->SendDebug("§strWord:", $str, 0);
$Resp = $this->SendDataToParent(json_encode(Array("DataID" => "{E310B701-4AE7-458E-B618-EC13A1A6F6A8}", "Function" => 0x10, "Address" => $Start , "Quantity" => 1, "Data" => $str)));
$str = pack('n',$Value); 
$this->SendDebug("§strWord:", $str, 0);
$Resp = $this->SendDataToParent(json_encode(Array("DataID" => "{E310B701-4AE7-458E-B618-EC13A1A6F6A8}", "Function" => 0x10, "Address" => $Start , "Quantity" => 1, "Data" => $str)));
$str = pack('v',$Value); 
$this->SendDebug("§strWord:", $str, 0);
$Resp = $this->SendDataToParent(json_encode(Array("DataID" => "{E310B701-4AE7-458E-B618-EC13A1A6F6A8}", "Function" => 0x10, "Address" => $Start , "Quantity" => 1, "Data" => $str)));

Alle drei Varianten liefern mehr oder weniger das gleiche Ergebnis. Es geht immer als ASCII durch. kann es sein, dass der SendDebug den String $str bei der Ausgabe verändert?

Ich hab dann mal die Debug Ausgabe des des Modbus Gateways aktiviert und zwischen meinem Modul und der Modbus Device Instanz vergleichen. Um den wert 10 zu schreiben taucht bei mir
TRANSMIT: 10 00 A6 00 10 10 61 und beim Modbus Device
TRANSMIT: 10 00 A6 00 01 02 00 0A auf.

Was ist $Value? Ein String? Ein Integer?
Michael

Sorry hatte ich vergessen zu schreiben. $Value ist ein Integer und da steht 10 drin. Hab die beiden Variablen vorher initialisiert um sicher zu gehen, dass da auch das richtige drin steht.

$Value = 10;
$str ='';
$this->SendDebug("§strWord:", $str, 0);
$Resp = $this->SendDataToParent(json_encode(Array("DataID" => "{E310B701-4AE7-458E-B618-EC13A1A6F6A8}", "Function" => 0x10, "Address" => $Start , "Quantity" => 1, "Data" => utf8_encode($str))));

Und wenn du utf8_encode bei den Daten setzt?
Weil, nur mit dem Pack, kommt bei mit 0a00 bzw 00a0 raus.
Michael

das 000A wäre ja richtig. ich probiere das mit mit dem utf8_encode heute Abend mal aus, wenn ich zu hause bin.

Ein Beitrag wurde in ein neues Thema verschoben: Modbus Datenfluss