SONOS Titel auf ESC/Pos Printer ausgeben (mit Max!, SONOS und HEX Serial output in Node-blue)

Liebe Leute
Wie kann ich einen HEX Buffer in Node-blue auf dem Serialport ausgeben?

Ich habe einen ESC/P Drucker. Sende ich ihm einen ASCII-Sting via Serial Node, so druckt er diesen brav. Doch um nun die Cut- und Vorschubfunktion zu nutzen, muss ich ihm ESC- oder Hex-Befehle senden.

In Processing habe ich das mal so gebaut und es funktioniert:

void printercut() {
myPort.write(0x1D); //Mode
myPort.write(0x56); //Cut
myPort.write(0x41); //Fullcut
myPort.write(0x0A); //Linefeeds
myPort.write(0x0A); //LF
}

Wie kann ich diese HEX-Werte in Node-blue ausgeben?

PS: Ziel ist es den Drucker so zu steuern, dass wenn meine Tochter einen Song in der Sonos Box hört, sie einen Taster (Max! Fensterkontakt) drücken kann und der Drucker spuckt den Songtitel aus :slight_smile:

1 Like

Super Idee… hast du mal einen Beispielflow?

In jedem Fall kannst du Steuerzeichen mit dem function-node in PHP erzeugen. https://www.php.net/chr

1 Like

@pmayer einmal mehr, du bist mein Held!
Es funzt!!! Wenn ich den Max! Fensterkontakt “ECO Switch” betätige, druckt der Kassenbondrucker einen Beleg mit dem Titel!

Bugs:

  1. Current_Album konnte ich noch nicht integrieren: Wie lese ich den 2. Eingang der Function-Node ein?
  2. Wenn sich in der SONOS Node der Wert ändert, so lösst dies einen Druck aus, ohne dass der Button betätigt wurde!
  3. Umlaute werden nicht korekt gedruckt.

Bildschirmfoto 2020-02-27 um 21.05.48

Inhalt der Function-Node:

$str  = "Titel: ".$message['payload'] .chr(0x0a); // Print Title
$str .= "Album: ".$message['payload'] .chr(0x0a); // Print Album
$str .= chr(0x0A).chr(0x0A);             // Linefeed
$str .= chr(0x1D).chr(0x56).chr(0x41);  // Fullcut
$str .= chr(0x0A);                      // Linefeed
$message['payload'] = $str;
return $message;

Komplette Node:

[
{
    "id": "f04ff0c2.31d468",
    "type": "function",
    "namespace": "function",
    "z": "90f14a29.01fde8",
    "name": "",
    "func": "$str  = \"Titel: \".$message['payload'] .chr(0x0a); // Print Title\n$str .= \"Album: \".$message['payload'] .chr(0x0a); // Print Album\n$str .= chr(0x0A).chr(0x0A);             // Linefeed\n$str .= chr(0x1D).chr(0x56).chr(0x41);  // Fullcut\n$str .= chr(0x0A);                      // Linefeed\n$message['payload'] = $str;\nreturn $message;",
    "inputs": "2",
    "outputs": 1,
    "noerr": 0,
    "x": 370,
    "y": 340,
    "wires": [
        [
            {
                "id": "759dbd53.5521fc",
                "port": 0
            },
            {
                "id": "29206ee2.22a3a2",
                "port": 0
            }
        ]
    ]
},
{
    "id": "e0f0f8e8.7c1f68",
    "type": "variable-in",
    "namespace": "variable",
    "z": "90f14a29.01fde8",
    "variabletype": "device",
    "family": "4",
    "peername": "Fensterkontakt_01",
    "peerid": "36",
    "channel": "1",
    "variable": "STATE",
    "eventsource": "all",
    "refractoryperiod": "0",
    "outputonstartup": false,
    "changes-only": false,
    "loopprevention": false,
    "looppreventiongroup": "",
    "name": "ECO Switch 01: AUTO",
    "x": 110,
    "y": 120,
    "wires": [
        [
            {
                "id": "eda85526.e3ba4",
                "port": 0
            },
            {
                "id": "f7e84cee.2556a8",
                "port": 0
            }
        ]
    ]
},
{
    "id": "d332d2a8.c976b",
    "type": "constant",
    "namespace": "variable",
    "z": "90f14a29.01fde8",
    "name": "",
    "payload": "true",
    "payloadType": "bool",
    "outputonstartup": false,
    "x": 140,
    "y": 200,
    "wires": [
        [
            {
                "id": "eda85526.e3ba4",
                "port": 0
            },
            {
                "id": "f7e84cee.2556a8",
                "port": 0
            }
        ]
    ]
},
{
    "id": "759dbd53.5521fc",
    "type": "serial-out",
    "namespace": "serial",
    "z": "90f14a29.01fde8",
    "name": "",
    "serial": "a71140d0.4aa2",
    "x": 555,
    "y": 310,
    "wires": []
},
{
    "id": "29206ee2.22a3a2",
    "type": "debug",
    "namespace": "debug",
    "z": "90f14a29.01fde8",
    "name": "",
    "active": true,
    "console": "debtab",
    "complete": "true",
    "loglevel": "info",
    "x": 550,
    "y": 360,
    "wires": []
},
{
    "id": "eda85526.e3ba4",
    "type": "variable-in",
    "namespace": "variable",
    "z": "90f14a29.01fde8",
    "variabletype": "device",
    "family": "6",
    "peername": "Sonos_Kueche",
    "peerid": "32",
    "channel": "1",
    "variable": "CURRENT_TITLE",
    "eventsource": "all",
    "refractoryperiod": "0",
    "outputonstartup": false,
    "changes-only": false,
    "loopprevention": false,
    "looppreventiongroup": "",
    "name": "",
    "x": 420,
    "y": 140,
    "wires": [
        [
            {
                "id": "f04ff0c2.31d468",
                "port": 0
            }
        ]
    ]
},
{
    "id": "f7e84cee.2556a8",
    "type": "variable-in",
    "namespace": "variable",
    "z": "90f14a29.01fde8",
    "variabletype": "device",
    "family": "6",
    "peername": "Sonos_Kueche",
    "peerid": "32",
    "channel": "1",
    "variable": "CURRENT_ALBUM",
    "eventsource": "all",
    "refractoryperiod": "0",
    "outputonstartup": false,
    "changes-only": false,
    "loopprevention": false,
    "looppreventiongroup": "",
    "name": "",
    "x": 425,
    "y": 180,
    "wires": [
        [
            {
                "id": "f04ff0c2.31d468",
                "port": 1
            }
        ]
    ]
},
{
    "id": "a71140d0.4aa2",
    "type": "serial-port",
    "namespace": "serial",
    "z": "",
    "serialport": "/dev/ttyUSB0",
    "serialbaud": "9600",
    "databits": "8",
    "parity": "none",
    "stopbits": "1",
    "newline": "\\n",
    "bin": "false",
    "out": "char",
    "addchar": true
}
]
3 Likes

The message is passed in as an associative array called $message . Information about the node can be found in the associative array $nodeInfo . The input index is passed in $inputIndex

Steht in der Hilfe des function node.

Ja, du löst ja auch einen event aus. Du musst dich darum kümmern, das die Info der Sonos ziwschengespeichert wird (context) und beim erzeugen eines events durch den Max-Taster der Serial-Node getriggert wird.

Data storage

Data can be stored by calling setNodeData($key, $value) , setFlowData($key, $value) or setGlobalData($key, $value) and retrieved with getNodeData($key) , getFlowData($key) or getGlobalData($key) .

Das könnte am Zeichensatz des Druckers liegen. Versuch mal utf8_decode zu machen, bevor es an den Drucker geht. Ich gehe davon aus, dass die Sonos UTF8 macht und der Drucker einfach ISO-8859-1.

1 Like

Hurrah, endlich sind die Umlaute gelöst:
$str = iconv (“UTF-8” , “CP858” , $message[‘payload’])

Die Codepage des Druckers ist “CP858”!

Danke auch für die anderen Tipps, da sehe ich leider noch nicht durch. Wie kann ich die EIngänge separat einlesen? Das mit den Hilfe in der Node kenne ich, leider hilft es mir nicht weiter.
$nodeInfo liefert “Array”
$inputIndex liefert “1”

Das habe ich bei meiner Limiter-Node auch gemacht. 3 Eingänge, zwei werden gepuffert und nur wenn der andere läuft geht es los.

1 Like

Ihr seid genial, Jungs @job und @pmayer. Jetzt läufts!

Manchmal kommen immer druckt es immer noch zwei Tickets, und ich muss noch ein Abfrage machen, die die Wiedergabe ab Radiostation und ab Spotify unterschiedet, da hier die Variablen unterschiedlich gefüllt sind. Aber im Grundsatz läufts!!!

PS. Das Delay von 100 ms stellt sicher, dass die Werte in der Functionnode vorhanden sind, bevor der Druck ausgelöst wird!

Bildschirmfoto 2020-02-27 um 22.42.31

   [
{
    "id": "8a208fb1.d1be6",
    "type": "function",
    "namespace": "function",
    "z": "90f14a29.01fde8",
    "name": "function",
    "func": "if ($inputIndex==0) \n{   setNodeData(\"title\", $message['payload']);\n    return NULL;\n} \nelse if ($inputIndex==1) \n{\n    setNodeData(\"album\", $message['payload']);\n    return NULL;\n}\nelse if ($inputIndex==2) \n{\n    $title = getNodeData(\"title\");\n    $album = getNodeData(\"album\");\n    \n    $str  = \"Titel: \".iconv (\"UTF-8\" , \"CP858\" , $title) .chr(0x0a); // Print Title\n    $str .= \"Album/Station: \".iconv (\"UTF-8\" , \"CP858\" , $album) .chr(0x0a); // Print Album\n    $str .= chr(0x0A).chr(0x0A);             // Linefeed\n    $str .= chr(0x1D).chr(0x56).chr(0x41);  // Fullcut\n    $message['payload'] = $str;\n    return $message;\n}",
    "inputs": "3",
    "outputs": 1,
    "noerr": 0,
    "x": 260,
    "y": 430,
    "wires": [
        [
            {
                "id": "29206ee2.22a3a2",
                "port": 0
            },
            {
                "id": "759dbd53.5521fc",
                "port": 0
            }
        ]
    ]
}

]

1 Like

Ich hab den Post mal ins richtige Thema geschoben. :wink:

Freut mich, dass es geholfen hat.

1 Like

Und so schaut’s nun aus, wenn meine Tochter wissen will, wie der Song im Radio heisst und sie den umfunktionierten Max! Türkontakt drückt.

3 Likes

Und ich habe den Threadtitel noch etwas nachhaltiger gestaltet.

1 Like

Pack hinter deinen Tastereingang einfach ein “rising edge”… weil vom Taster bekommst du true und false, also zwei Events.

2 Likes

Cooler use-case, respekt! :sunglasses: :+1:

Etwas Off-Topic … ich hatte mal “aus Versehen” CURRENT_TITLE in InfluxDB mitgelogged … und hatte anschliessend die komplette Playlist des Radiosenders meines Vertrauens in einer Tabelle :joy:

– Micha

1 Like

Genial, jetzt tutes, wie es soll. Man nehme einen alten Kassabonprinter, eine gesponnnene Idee und das Knowhow dieses Forums: nichts ist unmöglich!

2 Likes