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.
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.
Als Text(Roh) sieht es so aus
und wenn ich Hex als Darstellung wähle dann so
An die Funktion, die ich zum Konvertieren verwende wird es als String übergeben.
private function ConvertValue(array $Variable, string $Value)
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.
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
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
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.
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
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.
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.
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.