Herausforderung im SendToParent

Hallo Leute,

im Splitter (ubergeordete Instanz) soll etwas so ankommen:

"DataPayload":"\u0001"}

Wenn ich versuche mit $DataPayLoad = „\u0001“; und per SentToParent zum Splitter sende, sieht es am Splitter so aus:

"DataPayload":"\\u0001"}

(zwei Backslash)

Wie muss der String aussehen damit er korekt im Splitter ankommt? (also nur ein Backslash)

Joachim

Das ist kein String mit der Zeichenkette \u0001 sondern ein String bestehend aus dem Byte mit dem Wert 1.
Also chr(1) oder „\x01“.
Den String mit utf8_encode encodieren.
Den Rest erledigt json_encode für dich.
Schau dir doch einfach andere Module an, welche mit Binären Daten arbeiten. (Xbee, Plugwise etc…).
Aber… Hatten wir das Thema nicht schon x-mal?
Michael
PS: ein aussagekräftiger Titel wie ‚Probleme mit Json beim Datenaustausch‘ wären wünschenswert. :wink:

Hallo Michael,

Du hast völlig recht - und das in mehrfacher Weise!

  • wir hatten das Thema utf8_encode schon mal - fand es aber nicht wieder und wie ich jetzt sehe auch nicht in diesem Kontext
  • das Thema ist so für \u0001 mit
$DataPayload = utf8_encode(chr(1));

richtig
Hatte auch in meinen Modulen geschaut, war aber fälschlicherweise der Meinung die Funktion hat im Namen etwas mit „json“…:rolleyes:

Wie ist es den für \u0000?

$DataPayload = utf8_encode(chr(0));

funktioniert so leider nicht?

Joachim

Ohne Worte :smiley:


Michael

Edit: Wir sind hier nicht in C. Ein Zeichen in PHP-Strings ist immer 8 Bit groß und PHP kann auch mit 0-Bytes in Strings umgehen (binary safe).

…alles gut!:smiley:

Der Fehler lag an einer anderen Stelle!:rolleyes:

Super - funktioniert nun auch wie es soll…

Was mache ich da gerade? Ich habe mich entschlossen, mein Produktivsystem völlig neu aufzusetzen.
Die Art wie ich so manches damals gemacht habe lässt mich manchmal selbst erschrecken.
Bei mir wird das Licht und einige andere Sachen über Siemens LOGO gesteuert. Mit den neuen Möglichkeiten versuche ich nun auch neue Wege zu gehen
Jetzt ist das erste neue LOGO-Modul erst einmal prinzipiell lauffähig, werde meine Funktionssammlung jetzt so nach und nach in Module übertragen, sollte bei der Einrichtung dann deutlich mehr Struktur reinbringen und diese auch einfacher und schneller machen…

Vielen Dank für die unterstützung - auch wenn es eine Wiederholung war!:slight_smile:

Joachim

Bitte… lernt man nicht durch Wiederholung? :smiley:
Was meinst du wohl wie oft ich selber in meinen Modulen abschaue :wink:

Michael

…ich muss das Thema leider noch einmal beleben…:rolleyes:

Zur Testkonfiguration:

  • IPS-Instanz „Modbus-Device“
  • 16Bit Vorzeichenlos
  • eigener „Fake-Splitter“ um die Ausgabe sichtbar zu machen

Ausgabe des Fake-Splitters bei Sende-Werten in der Modbus-Device-Instanz:
0 -> „Data“:"\u0000\u0000"
1 -> „Data“:"\u0000\u0001"
128 -> „Data“:"\u0000€"
255 -> „Data“:"\u0000ÿ"
512 -> „Data“:"\u0002\u0000"

Die Umsetzung mit chr() führt zu anderen Ergebnissen. Im Internet gibt es Skripte die Werte > 255 in mehrere Zeichen umsetzen, leider sehe meine Versuche mit denen im Ergebnis immer etwas anders aus…:mad:

Joachim

…mg mir denn zumindest jemand die Logik dahinter erläutern?

Vergiss es.
Benutzte Json_decode und utf8_decode und du hast die Rowdaten.
IPS nutzt (vermutlich) RapidJson, PHP nutzt das nicht.
Die Implementierung ist leicht unterschiedlich, was mir bisher aber nur bei SetXxxFilter aufgefallen ist.
Ansonsten frisst IPS auch das JSON aus PHP und umgekehrt.
Wenn du wissen willst, warum nicht alle Zeichen mit \u maskiert werden, schau hier; weil PHP kann das auch:
PHP: json_encode - Manual
Musst dafür die Option JSON_UNESCAPED_UNICODE setzen.
Für mehr als ein Byte zu int/float nimmst du unpack.
https://www.php.net/manual/de/function.unpack.php
Michael

Vielen Dank erst einmal für Deine Antwort!

Nun, eigentlich möchte ich ja nur wissen wie ich in meiner eigenen ModBusDevice-Instanz etwas „verpacken“ muss, damit es im IPS-ModBus-Splitter so ankommt, wie vom „IPS-Eigenen-Device-Modul“.

Ich habe in meinem SentToParent die Option JSON_UNESCAPED_UNICODE gesetzt, aber ohne den Integerwert in irgendeiner Weise zu „manipulieren“ - es kommt jetzt nur der Wert ansich an (ohne jegliche Formatierung).

Von ein Devices an das Gateway hat Symcon und ich ein Modul.
Da musst du nix verpacken oder umrechnen. Das sind Integer Werte bei Function, Address etc…
IPSBGETech/BGETechModule.php at 265fa2e784adcac7388d1dff1f0fc8b842777a6c · Nall-chan/IPSBGETech · GitHub
Michael

…in Deinem Beispiel liest Du aber doch Wert aus, oder? Auslesen der diversen vorhandenen Werte funktioniert inzwischen prima, Der ankommende Wert ist hierin:

$Result = (unpack("n*", substr($Result,2)));

(weiß gar nicht mehr wie ich darauf gekommen bin…)

Setzen von Werten via Modbus habe ich nur über die IPS-Instanz getestet und da funktioniert es.
Da meine im Modul generierten Werte sich aber unterscheiden (dazu versuche ich eben Sende-Befehle auf den Fake-Splitter zu senden) habe ich bisher ehrlicherweise überhaupt nicht versucht etwas zu aus meinem Modul an das echte Gerät zu senden…
Ich hatte schon mal etwas mit DMX in der Art gemacht, da musste ich wie weiter oben in diesem Thread mit chr() arbeiten - erfolgreich…

Chr ist immer nur ein Byte, das reicht für max. 8 Merker. Jedes Bit entspricht ein Merker.
Also musst du bei einem Merker eigentlich nur Quantity auf 1 setzen, und chr(0) oder chr(1) für false/true.
Ohne Gewähr und nicht getestet :wink:
Es sollten auch mehrere aufeinander folgende Merker auf einmal gehen, dann musst du diese Bitweise zusammenbauen.
Michael
PS: danach immer utf8_encode auf ‚Data‘ und dann alle Felder als JSON kodieren.

…hier ist es aber anders, hier habe ich 16Bit und in Teilen aber Werte >255…[emoji17]

Ja und? Dann wieder mit

pack(‚n‘, int16);
Kommen wie Werte falsch an, dann nach den Pack Data mit strrev() umdrehen.
Das wäre das Swap MSB/LSB.
Michael

…habe es jetzt so umgesetzt:

$SendPayload = chr($Payload >> 8).chr($Payload & 255);

Ist nach meinen Tests nicht mehr im Ergebnis unterscheidbar von den Werte die ModBus-Instanz an den Splitter sendet - erste Tests waren auch erfolgreich…:smiley:

Meine neue Brötje Heizung hat ein ModBus-Modul - da kann man hunderte von Daten sehen und diverse davon auch setzen. Jetzt kommt die Fleißarbeit…

VIELEN DANK!

Joachim