Kann mir jemand mit dem Thema weiterhelfen ? Im ioBroker-Forum bekomme ich leider keine Antwort.
Gruss
Peter
Kann mir jemand mit dem Thema weiterhelfen ? Im ioBroker-Forum bekomme ich leider keine Antwort.
Gruss
Peter
Hallo,
Ich würde es versuchen dir zu helfen - Brauche aber noch das Verständnis was du machen möchtest.
Kannst du die Logik in deine Worte mal niederschreiben.
Ja, gerne. Ich habe eine selbst entwickelte Alarmanlage die über UART mit dem ioBroker kommuniziert. Die Anlage sendet codierte Daten wie z.b. "0011223344" die ich über Node Red wieder decodiere. Die Daten sind eigentlich nur eine Anreihung von Hexzahlen in 2er Gruppen. Also "00" ist die erste Hex, "11" die 2te usw. Die letzte Zahl "hier 44" ist genau genommen keine Date, sondern eine XOR-Verknüpfung der Zahlenpaare 00-33 und wird von der Alarmanlage erzeugt und mitgesendet und soll die Checksumme der Daten darstellen. Ziel ist es die Empfangenen Daten 00-33 im Node Red so zu verknüpfen, dass die selbe Checksumme errechnet wird und mir so bestätigt, dass die Übertragung vollständig und richtig war.
Kannst Du helfen ?
Sry - habe es gar nicht mehr dran gedacht - mache gleich noch mal gedacken
Ich versuche noch mal das ganze in meine eigene Worte zu fassen.
Dein Ziel / Dein Wünsch ist es aus Anregungen von Zahlen eine Prüfsumme zu errechnen. Dabei ist die Prüfsumme vorgehen, da diese schon von der Alarmanale rechnet würden ist.
Nun, weißt du die Formel von der Prüfsumme, wie die Anlage die rechnet?
Sind die Daten die kommen immer gleich lang ?
Dein Ziel / Dein Wünsch ist es aus Anregungen von Zahlen eine Prüfsumme zu errechnen. Dabei ist die Prüfsumme vorgehen, da diese schon von der Alarmanale rechnet würden ist.
Genau.
Nun, weißt du die Formel von der Prüfsumme, wie die Anlage die rechnet?
Na klar. Siehe Screenshot.
Sind die Daten die kommen immer gleich lang ?
Ja, sind sie. Insg. sind es 7Stk. 2er Hexpaare + Checksumme. Ich hab mal ein Screenshot aus Node Red angehangen die diese live aussehen. In den Fall ist die "04" die Prüfsumme. Wenn man es nachrechnet passt es auch. 05 XOR 01 = 04.
In Node Red hab ich schon die Daten geteilt und in ioBroker-Objekte geschrieben. Hier gibt es die Funktion "Test", wo ich schon versuchte, die komplett empfangenen Daten mit XOR zu errechnen. Da komme ich aber nicht weiter.
[
{
"id": "2da69b37.1df24c",
"type": "tab",
"label": "HAA Empfangen",
"disabled": false,
"info": "Empfangene Daten werden hier auf den jeweiligen\nBytes gekürzt und maskiert."
},
{
"id": "fc292ded.300e98",
"type": "debug",
"z": "2da69b37.1df24c",
"name": "Input ungekürzt",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"x": 400,
"y": 200,
"wires": []
},
{
"id": "46b4f56f.ea0dc4",
"type": "serial in",
"z": "2da69b37.1df24c",
"name": "Statusempfang",
"serial": "da7b24a1.565828",
"x": 120,
"y": 280,
"wires": [
[
"fc292ded.300e98",
"65ee1056.98349",
"92d59a98.232b7",
"c2cb0851.237438",
"1d1f4b9a.95161c",
"ea03f2c9.a0e1a"
]
]
},
{
"id": "65ee1056.98349",
"type": "function",
"z": "2da69b37.1df24c",
"name": "String kürzen (0. / 1. Stelle) / BAS",
"func": "var string = msg.payload; //ankommende payload speichern\n\n//String kürzen\nvar string_teil = string.substring(0,2);\n\nreturn [{payload: string_teil}];",
"outputs": 1,
"noerr": 0,
"x": 440,
"y": 280,
"wires": [
[
"381721c3.e06106"
]
]
},
{
"id": "92d59a98.232b7",
"type": "function",
"z": "2da69b37.1df24c",
"name": "String kürzen (2. / 3. Stelle) / SIR",
"func": "var string = msg.payload; //ankommende payload speichern\n\n//String kürzen\nvar string_teil = string.substring(2,4);\n\nreturn [{payload: string_teil}];",
"outputs": 1,
"noerr": 0,
"x": 440,
"y": 480,
"wires": [
[
"78bdb8a6.e688a"
]
]
},
{
"id": "c2cb0851.237438",
"type": "function",
"z": "2da69b37.1df24c",
"name": "String kürzen (4. / 5. Stelle) / REE",
"func": "var string = msg.payload; //ankommende payload speichern\n\n//String kürzen\nvar string_teil = string.substring(4,6);\n\nreturn [{payload: string_teil}];",
"outputs": 1,
"noerr": 0,
"x": 460,
"y": 680,
"wires": [
[
"dec6c73.c1cf638"
]
]
},
{
"id": "8a72b235.d47318",
"type": "function",
"z": "2da69b37.1df24c",
"name": "String kürzen (10. / 11. / 12. / 13. Stelle) / SW",
"func": "var string = msg.payload; //ankommende payload speichern\n\n//String kürzen\nvar string = string.substring(10,14);\n\nreturn [{payload: string}];",
"outputs": 1,
"noerr": 0,
"x": 500,
"y": 900,
"wires": [
[
"22af2a70.c8faee"
]
]
},
{
"id": "381721c3.e06106",
"type": "function",
"z": "2da69b37.1df24c",
"name": "BAS (Byte0) Splitten - Basis",
"func": "var bas_int = parseInt(msg.payload, 16); //ankommende Hex-Nachricht (Basis 16) in Integer wandeln\n\nvar kal = false;\nif((bas_int & 1) == \"1\") //Maskierung und gleichzeitig in Boolean ändern\n{\n kal = true;\n}\n\nvar val = false;\nif((bas_int & 2) == \"2\") //Maskierung und gleichzeitig in Boolean ändern\n{\n val = true;\n}\n\nvar alm = false;\nif((bas_int & 4) == \"4\") //Maskierung und gleichzeitig in Boolean ändern\n{\n alm = true;\n}\nvar als = false;\nif((bas_int & 8) == \"8\") //Maskierung und gleichzeitig in Boolean ändern\n{\n als = true;\n}\n\nvar alf = false;\nif((bas_int & 16) == \"16\") //Maskierung und gleichzeitig in Boolean ändern\n{\n alf = true;\n}\nvar sab = false;\nif((bas_int & 32) == \"32\") //Maskierung und gleichzeitig in Boolean ändern\n{\n sab = true;\n}\n\nreturn [{payload: kal}, {payload: val},{payload: alm}, {payload: als},{payload: alf}, {payload: sab}];",
"outputs": 6,
"noerr": 0,
"x": 920,
"y": 280,
"wires": [
[
"6d2f24fd.83778c"
],
[
"f57b8515.a2eb38"
],
[
"881e87f5.694ca"
],
[
"e928711b.a11db"
],
[
"a0fe88a7.655cf8"
],
[
"203ddcf0.ae3e1c"
]
]
},
{
"id": "881e87f5.694ca",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Alarm",
"topic": "node-red.0.HAA.Basis.Alarm",
"ack": "true",
"autoCreate": "true",
"x": 1230,
"y": 240,
"wires": []
},
{
"id": "6d2f24fd.83778c",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Kontaktalarm",
"topic": "node-red.0.HAA.Basis.Kontaktalarm",
"ack": "true",
"autoCreate": "true",
"x": 1250,
"y": 120,
"wires": []
},
{
"id": "e928711b.a11db",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Start",
"topic": "node-red.0.HAA.Basis.Start",
"ack": "true",
"autoCreate": "true",
"x": 1230,
"y": 300,
"wires": []
},
{
"id": "f57b8515.a2eb38",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Voralarm",
"topic": "node-red.0.HAA.Basis.Voralarm",
"ack": "true",
"autoCreate": "true",
"x": 1240,
"y": 180,
"wires": []
},
{
"id": "a0fe88a7.655cf8",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Scharf",
"topic": "node-red.0.HAA.Basis.Scharf",
"ack": "true",
"autoCreate": "true",
"x": 1230,
"y": 360,
"wires": []
},
{
"id": "203ddcf0.ae3e1c",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Sabotagekontakt",
"topic": "node-red.0.HAA.Basis.Sabotagealarm",
"ack": "true",
"autoCreate": "true",
"x": 1270,
"y": 420,
"wires": []
},
{
"id": "78bdb8a6.e688a",
"type": "function",
"z": "2da69b37.1df24c",
"name": "SIR (Byte1) Splitten - Sirene",
"func": "var sir_int = parseInt(msg.payload, 16); //ankommende Hex-Nachricht (Basis 16) in Integer wandeln\n\nvar sto = false;\nif((sir_int & 1) == \"1\") //Maskierung und gleichzeitig in Boolean ändern\n{\n sto = true;\n}\n\nreturn [{payload: sto}];",
"outputs": 1,
"noerr": 0,
"x": 920,
"y": 480,
"wires": [
[
"e9e1c426.6757f8"
]
]
},
{
"id": "e9e1c426.6757f8",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Störung",
"topic": "node-red.0.HAA.Sirene.Störung",
"ack": "true",
"autoCreate": "true",
"x": 1240,
"y": 480,
"wires": []
},
{
"id": "dec6c73.c1cf638",
"type": "function",
"z": "2da69b37.1df24c",
"name": "REE (Byte2) Splitten - Reedkontakte",
"func": "var ree_int = parseInt(msg.payload, 16); //ankommende Hex-Nachricht (Basis 16) in Integer wandeln\n\nvar ree0 = false;\nif((ree_int & 1) == \"1\") //Maskierung und gleichzeitig in Boolean ändern\n{\n ree0 = true;\n}\n\nvar ree1 = false;\nif((ree_int & 2) == \"2\") //Maskierung und gleichzeitig in Boolean ändern\n{\n ree1 = true;\n}\n\nvar ree2 = false;\nif((ree_int & 4) == \"4\") //Maskierung und gleichzeitig in Boolean ändern\n{\n ree2 = true;\n}\n\nvar ree3 = false;\nif((ree_int & 8) == \"8\") //Maskierung und gleichzeitig in Boolean ändern\n{\n ree3 = true;\n}\n\nvar ree4 = false;\nif((ree_int & 16) == \"16\") //Maskierung und gleichzeitig in Boolean ändern\n{\n ree4 = true;\n}\n\nvar ree5 = false;\nif((ree_int & 32) == \"32\") //Maskierung und gleichzeitig in Boolean ändern\n{\n ree5 = true;\n}\n\nreturn [{payload: ree0}, {payload: ree1},{payload: ree2}, {payload: ree3},{payload: ree4}, {payload: ree5}];",
"outputs": 6,
"noerr": 0,
"x": 950,
"y": 680,
"wires": [
[
"e6d3475a.15eed8"
],
[
"8f916e73.1d74b"
],
[
"de1a6728.a2b8"
],
[
"83b12b42.bbcc18"
],
[
"197e4e9a.388119"
],
[
"389d88ee.224938"
]
]
},
{
"id": "e6d3475a.15eed8",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Eingangstür",
"topic": "node-red.0.HAA.Reed.Eingangstür",
"ack": "true",
"autoCreate": "true",
"x": 1250,
"y": 540,
"wires": []
},
{
"id": "8f916e73.1d74b",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Eingangsfenster",
"topic": "node-red.0.HAA.Reed.Eingangsfenster",
"ack": "true",
"autoCreate": "true",
"x": 1260,
"y": 600,
"wires": []
},
{
"id": "de1a6728.a2b8",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Garage",
"topic": "node-red.0.HAA.Reed.Garage",
"ack": "true",
"autoCreate": "true",
"x": 1240,
"y": 660,
"wires": []
},
{
"id": "83b12b42.bbcc18",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Wohnzimmer",
"topic": "node-red.0.HAA.Reed.Wohnzimmer",
"ack": "true",
"autoCreate": "true",
"x": 1250,
"y": 720,
"wires": []
},
{
"id": "197e4e9a.388119",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Esszimmer",
"topic": "node-red.0.HAA.Reed.Esszimmer",
"ack": "true",
"autoCreate": "true",
"x": 1250,
"y": 780,
"wires": []
},
{
"id": "389d88ee.224938",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Keller",
"topic": "node-red.0.HAA.Reed.Keller",
"ack": "true",
"autoCreate": "true",
"x": 1230,
"y": 840,
"wires": []
},
{
"id": "22af2a70.c8faee",
"type": "function",
"z": "2da69b37.1df24c",
"name": "SW (Byte5/6) Splitten - Software",
"func": "var string = msg.payload; //ankommende payload speichern\n//vom string kürzen\nvar string_teil1 = string.substring(0,2);\nvar swh_hex = parseInt(string_teil1, 16); //ankommende Hex-Nachricht (Basis 16) in Integer wandeln\nvar string_teil2 = string.substring(2,4);\nvar swn_hex = parseInt(string_teil2, 16); //ankommende Hex-Nachricht (Basis 16) in Integer wandeln\n\n//----------SWH--------------\nvar swh = 0;\nif((swh_hex & 1) == \"1\") //Maskierung und gleichzeitig in eine Zahl wandeln\n{\n swh += 1;\n}\n\nif((swh_hex & 2) == \"2\") \n{\n swh += 2;\n}\n\nif((swh_hex & 4) == \"4\") \n{\n swh += 4;\n}\n\nif((swh_hex & 8) == \"8\") \n{\n swh += 8;\n}\n\nif((swh_hex & 16) == \"16\") \n{\n swh += 16;\n}\n\nif((swh_hex & 32) == \"32\") \n{\n swh += 32;\n}\n\nif((swh_hex & 64) == \"64\") \n{\n swh += 64;\n}\n\nif((swh_hex & 128) == \"128\") //Maskierung und gleichzeitig in Boolean ändern\n{\n swh += 128;\n}\n\n//----------SWN--------------\nvar swn = 0;\nif((swn_hex & 1) == \"1\") //Maskierung und gleichzeitig in eine Zahl wandeln\n{\n swn += 1;\n}\n\nif((swn_hex & 2) == \"2\") \n{\n swn += 2;\n}\n\nif((swn_hex & 4) == \"4\") \n{\n swn += 4;\n}\n\nif((swn_hex & 8) == \"8\") \n{\n swn += 8;\n}\n\nif((swn_hex & 16) == \"16\") \n{\n swh += 16;\n}\n\nif((swn_hex & 32) == \"32\") \n{\n swn += 32;\n}\n\nif((swn_hex & 64) == \"64\") \n{\n swn += 64;\n}\n\nif((swn_hex & 128) == \"128\") //Maskierung und gleichzeitig in Boolean ändern\n{\n swn += 128;\n}\n\n//Hex wieder in String wandeln und zusammensetzten\nvar version = \"v\";\nversion += swh.toString();\nversion += \".\";\nversion += swn.toString();\n\nreturn [{payload: version}];",
"outputs": 1,
"noerr": 0,
"x": 930,
"y": 900,
"wires": [
[
"5157645f.db9a4c"
]
]
},
{
"id": "5157645f.db9a4c",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Softwareversion",
"topic": "node-red.0.HAA.Software.Version",
"ack": "true",
"autoCreate": "true",
"x": 1260,
"y": 900,
"wires": []
},
{
"id": "1d1f4b9a.95161c",
"type": "function",
"z": "2da69b37.1df24c",
"name": "String kürzen (14. / 15. Stelle) / CHK",
"func": "var string = msg.payload; //ankommende payload speichern\n\n//String kürzen\nvar string_teil = string.substring(14,16);\n\nreturn [{payload: string_teil}];",
"outputs": 1,
"noerr": 0,
"x": 470,
"y": 960,
"wires": [
[
"4088645b.a1ca94"
]
]
},
{
"id": "4088645b.a1ca94",
"type": "ioBroker out",
"z": "2da69b37.1df24c",
"name": "Checksumme HAA",
"topic": "node-red.0.HAA.Chk.HAA",
"ack": "true",
"autoCreate": "true",
"x": 1270,
"y": 960,
"wires": []
},
{
"id": "ea03f2c9.a0e1a",
"type": "function",
"z": "2da69b37.1df24c",
"name": "Test",
"func": "var x = parseInt(5, 16);\nvar y = parseInt(4, 16);\n\nvar test = x ^ y;\n\nreturn [{payload: test}];",
"outputs": 1,
"noerr": 0,
"x": 370,
"y": 140,
"wires": [
[]
]
},
{
"id": "da7b24a1.565828",
"type": "serial-port",
"z": "2da69b37.1df24c",
"serialport": "/dev/ttyAMA0",
"serialbaud": "9600",
"databits": "8",
"parity": "none",
"stopbits": "1",
"newline": "16",
"bin": "false",
"out": "count",
"addchar": true
}
]
Alles anzeigen
Schon eine Idee wie man sowas umsetzten kann ?
Sry - habe das aus den Augen verlorenen. Ich habe ein Ansatz werde noch mal weiter machen.
Kannst du mir mal ca. 30 - 40 solche Datensätze zukommen lassen.
30-40 Datensätze ??? Nur 3 der 7 Paare sind Werte die sich ändern können. Alle anderen bleiben eigentlich immer gleich. Es ändert sich mal was wenn ein Fenster offen ist oder die Anlage scharf geschaltet wird, aber die meisten Datensätze sehen so aus wie das was ich schon als Screenshot geschickt hatte.
Wenn z.B. die Anlage scharf ist, ist der Datensatz:
"1000000000050114" --> Hex 10 gedeutet in Binär 0001 0000 in Byte 0 eine 1 an Bit 4 (ALF), siehe Screenshot. Was soviel heißt wie AnLagescharF. 14 ist dann die Checksumme.
Wenn ein Fenster offen ist:
"0100010000050104" --> Hex 01 gedeutet in Binär 0000 0001 in Byte 0 eine 1 an Bit 0 (KAL). Was soviel heißt wie KontaktALarm. Die Hex 01 als drittes Paar gedeutet in Binär 0000 0001 in Byte 2 eine 1 an Bit 0 (REE0). Heißt hier REEdkontakt 0.......und so weiter.
Wenn z.b. alle Fenster und Türen geöffnet sind sieht es so aus.:
"01003F000005013A"
Bei 30-40 Datensätzen müsste ich ja alle Kombinationen durchgehen die es gibt.
Ach ja, der Anhang.
Gibt es neue Erkenntnisse ?
Jetzt bin ich etwas enttäuscht.
Tut mir leid.....
Ich hatte in den letzten Tage viel zu tun.
Ich poste morgen dir es hin. Bin gerade nur mit Handy online....
Hat sich schon erledigt, trotzdem danke.
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!