NEWS
IRobot Roomba Steuerung
-
Hallo zusammen,
ich habe mir gebraucht einen iRobot Roomba 581 sehr günstig geschossen und ihn mir nun in Node-Red eingebaut.
Dazu habe ich mir noch den WLAN-Aufsatz Thinking Cleaner (http://www.thinkingcleaner.com) besorgt - einfach und klasse Teil.
Zuerst muss der Flow "Roomba - Initialisierung !!!" aufgerufen werden (einmal), um die notwendigen Datenpunkte zu erzeugen.
[{"id":"24ac0962.db53f6","type":"inject","name":"Datenpunkte definieren - muss einmal gestartet werden!!!","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":242,"y":103,"z":"1231008e.edceff","wires":[["8c5bceff.73a43"]]},{"id":"d32a5e05.2cd5a","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.command_Clean","ack":"false","autoCreate":"true","x":584,"y":269,"z":"1231008e.edceff","wires":[]},{"id":"8c5bceff.73a43","type":"function","name":"Trigger rücksetzen","func":"msg1 = {};\nbefehl = \"0\";\n\nmsg1.payload = befehl;\n\n\nreturn [msg1];","outputs":"1","noerr":0,"x":220,"y":269,"z":"1231008e.edceff","wires":[["d32a5e05.2cd5a","2181a5ff.de7e5a","f4efb6c1.0b1048","fadec315.05214","be3875de.41c788","4a6d87c0.b59278","7736dc3.f88c924"]]},{"id":"2181a5ff.de7e5a","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.command_MaxSaugen","ack":"false","autoCreate":"true","x":605,"y":330,"z":"1231008e.edceff","wires":[]},{"id":"f4efb6c1.0b1048","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.command_BackToDock","ack":"false","autoCreate":"true","x":607,"y":386,"z":"1231008e.edceff","wires":[]},{"id":"fadec315.05214","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.command_LeaveDock","ack":"false","autoCreate":"true","x":605,"y":441,"z":"1231008e.edceff","wires":[]},{"id":"be3875de.41c788","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.command_Findme","ack":"false","autoCreate":"true","x":596,"y":496,"z":"1231008e.edceff","wires":[]},{"id":"4a6d87c0.b59278","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.command_DriveStop","ack":"false","autoCreate":"true","x":604,"y":549,"z":"1231008e.edceff","wires":[]},{"id":"7736dc3.f88c924","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.command_PowerOff","ack":"false","autoCreate":"true","x":607,"y":605,"z":"1231008e.edceff","wires":[]}]
Hier werden die Trigger-Datenpunkte gesetzt, die dann in Vis verwendet werden können, um Aktionen zu starten.
Diese Trigger-Datenpunkte sind
node-red.0.Roomba.command_Clean => Cleaning starten
node-red.0.Roomba.command_MaxSaugen => Max-Saugen starten
node-red.0.Roomba.command_BackToDock => Zurück zur Basis-Station (Dock / Ladestation)
node-red.0.Roomba.command_LeaveDock => Verlasse die Basis-Station (Dock / Ladestation)
node-red.0.Roomba.command_Findme => Der Roomba gibt eine Tonfolge aus, um ihn besser zu finden
node-red.0.Roomba.command_DriveStop => So schnell wie möglich STOP
node-red.0.Roomba.command_PowerOff => Den Roomba ausschalten
Die Werte sind standardmäßig auf 0. Wird ein Wert (z.B. in Vis mit einer Taste) auf 1 gesetzt, wird die hinterlegte Funktion aufgerufen und der Wert wieder auf 0 zurückgesetzt.
–------------------------------------------------------------------------
Der nächste Flow ist "Roomba Steuerung" - hier sind die genannten Funktionsaufrufe enthalten.
[{"id":"53556f91.acaa9","type":"subflow","name":"Sub_Roomba_Steuerung","in":[{"x":63,"y":85,"wires":[{"id":"101dd7dd.efe228"}]}],"out":[{"x":1163,"y":134,"wires":[{"id":"6d393f45.92c6c","port":0}]}]},{"id":"41df1cc7.be20e4","type":"function","name":"Bauen","func":"var IP = msg.RoombaIP;\nvar Befehl = msg.kommando;\n\nvar Ausgabe = \"http://\" + IP + \"/command.json?command=\" + Befehl;\nmsg.url = Ausgabe;\n\nreturn msg;","outputs":"1","noerr":0,"x":344,"y":83,"z":"53556f91.acaa9","wires":[["30f42818.cf0bd8","6d393f45.92c6c"]]},{"id":"30f42818.cf0bd8","type":"http request","name":"Roomba command","method":"GET","ret":"txt","url":"","x":560,"y":82,"z":"53556f91.acaa9","wires":[["fcc86132.0337a"]]},{"id":"6d393f45.92c6c","type":"function","name":"Trigger rücksetzen","func":"msg.payload = \"0\";\nreturn msg;","outputs":"1","noerr":0,"x":555,"y":133,"z":"53556f91.acaa9","wires":[[]]},{"id":"fcc86132.0337a","type":"function","name":"Antwort auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\nvar name_startpos = quelle.indexOf('result');\nvar name = quelle.substr(name_startpos + 11, 50);\nvar name_endpos = name.indexOf('\"');\nname = name.substring(0, name_endpos);\nmsg1.payload = name;\n\nreturn [msg1];\n","outputs":"1","noerr":0,"x":777,"y":83,"z":"53556f91.acaa9","wires":[["60bf6063.9f40a"]]},{"id":"60bf6063.9f40a","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.CommandStatus","ack":"false","autoCreate":"true","x":1034,"y":83,"z":"53556f91.acaa9","wires":[]},{"id":"101dd7dd.efe228","type":"function","name":"IP setzen","func":"msg.RoombaIP = \"[IP_ROOMBA_EINTRAGEN]\"\nreturn msg;","outputs":1,"noerr":0,"x":196,"y":83,"z":"53556f91.acaa9","wires":[["41df1cc7.be20e4"]]},{"id":"6d2de672.92d218","type":"ioBroker in","name":"command_Clean","topic":"node-red.0.Roomba.command_Clean","payloadType":"value","x":83,"y":52,"z":"898d14e1.7672e8","wires":[["163fe4db.e9c01b"]]},{"id":"163fe4db.e9c01b","type":"switch","name":"Wenn gesetzt","property":"payload","rules":[{"t":"eq","v":"1"}],"checkall":"true","outputs":1,"x":313,"y":51,"z":"898d14e1.7672e8","wires":[["982c2ff5.67d3d"]]},{"id":"982c2ff5.67d3d","type":"function","name":"Daten setzen","func":"msg.kommando = \"clean\"\nmsg.topic=\"command_Clean\";\nreturn msg;","outputs":1,"noerr":0,"x":480,"y":50,"z":"898d14e1.7672e8","wires":[["f19fbacf.0e6048"]]},{"id":"4ed9ac69.b12654","type":"ioBroker out","name":"","topic":"","ack":"false","autoCreate":"true","x":1085,"y":194,"z":"898d14e1.7672e8","wires":[]},{"id":"15b0d45d.ea4f2c","type":"function","name":"Join","func":"msg.topic = \"node-red.0.Roomba.\" + msg.topic;\nreturn msg;","outputs":1,"noerr":0,"x":954.142822265625,"y":194.00001525878906,"z":"898d14e1.7672e8","wires":[["4ed9ac69.b12654"]]},{"id":"f19fbacf.0e6048","type":"subflow:53556f91.acaa9","name":"","x":778,"y":193,"z":"898d14e1.7672e8","wires":[["15b0d45d.ea4f2c"]]},{"id":"6c20afb.f93df5","type":"ioBroker in","name":"command_SpotSaugen","topic":"node-red.0.Roomba.command_SpotSaugen","payloadType":"value","x":103,"y":116,"z":"898d14e1.7672e8","wires":[["bdd39ea3.422c6"]]},{"id":"bdd39ea3.422c6","type":"switch","name":"Wenn gesetzt","property":"payload","rules":[{"t":"eq","v":"1"}],"checkall":"true","outputs":1,"x":313,"y":116,"z":"898d14e1.7672e8","wires":[["f4ff457.f0b00b8"]]},{"id":"f4ff457.f0b00b8","type":"function","name":"Daten setzen","func":"msg.kommando = \"spot\"\nmsg.topic=\"command_SpotSaugen\";\nreturn msg;","outputs":1,"noerr":0,"x":480,"y":115,"z":"898d14e1.7672e8","wires":[["f19fbacf.0e6048"]]},{"id":"74533a2a.8bacc4","type":"ioBroker in","name":"command_MaxSaugen","topic":"node-red.0.Roomba.command_MaxSaugen","payloadType":"value","x":103,"y":176,"z":"898d14e1.7672e8","wires":[["2e79d958.d18626"]]},{"id":"2e79d958.d18626","type":"switch","name":"Wenn gesetzt","property":"payload","rules":[{"t":"eq","v":"1"}],"checkall":"true","outputs":1,"x":313,"y":176,"z":"898d14e1.7672e8","wires":[["fc216cd6.03de9"]]},{"id":"fc216cd6.03de9","type":"function","name":"Daten setzen","func":"msg.kommando = \"max\"\nmsg.topic=\"command_MaxSaugen\";\nreturn msg;","outputs":1,"noerr":0,"x":480,"y":175,"z":"898d14e1.7672e8","wires":[["f19fbacf.0e6048"]]},{"id":"8bc1a754.743e58","type":"ioBroker in","name":"command_BackToDock","topic":"node-red.0.Roomba.command_BackToDock","payloadType":"value","x":102,"y":234,"z":"898d14e1.7672e8","wires":[["5200de48.adff2"]]},{"id":"5200de48.adff2","type":"switch","name":"Wenn gesetzt","property":"payload","rules":[{"t":"eq","v":"1"}],"checkall":"true","outputs":1,"x":312,"y":234,"z":"898d14e1.7672e8","wires":[["daf582cf.250a8"]]},{"id":"daf582cf.250a8","type":"function","name":"Daten setzen","func":"msg.kommando = \"dock\"\nmsg.topic=\"command_BackToDock\";\nreturn msg;","outputs":1,"noerr":0,"x":479,"y":233,"z":"898d14e1.7672e8","wires":[["f19fbacf.0e6048"]]},{"id":"5a728e93.a58d7","type":"ioBroker in","name":"command_LeaveDock","topic":"node-red.0.Roomba.command_LeaveDock","payloadType":"value","x":103.5,"y":302,"z":"898d14e1.7672e8","wires":[["c0a89ca3.3f576"]]},{"id":"c0a89ca3.3f576","type":"switch","name":"Wenn gesetzt","property":"payload","rules":[{"t":"eq","v":"1"}],"checkall":"true","outputs":1,"x":313.5,"y":302,"z":"898d14e1.7672e8","wires":[["8f619f7c.709e6"]]},{"id":"8f619f7c.709e6","type":"function","name":"Daten setzen","func":"msg.kommando = \"leavehomebase\"\nmsg.topic=\"command_LeaveDock\";\nreturn msg;","outputs":1,"noerr":0,"x":480.5,"y":301,"z":"898d14e1.7672e8","wires":[["f19fbacf.0e6048"]]},{"id":"219c0db1.de63f2","type":"ioBroker in","name":"command_Findme","topic":"node-red.0.Roomba.command_Findme","payloadType":"value","x":99.5,"y":368,"z":"898d14e1.7672e8","wires":[["b16cad9d.4e935"]]},{"id":"b16cad9d.4e935","type":"switch","name":"Wenn gesetzt","property":"payload","rules":[{"t":"eq","v":"1"}],"checkall":"true","outputs":1,"x":309.5,"y":368,"z":"898d14e1.7672e8","wires":[["2c5eb0a.fd3a15"]]},{"id":"2c5eb0a.fd3a15","type":"function","name":"Daten setzen","func":"msg.kommando = \"find_me\"\nmsg.topic=\"command_Findme\";\nreturn msg;","outputs":1,"noerr":0,"x":476.5,"y":367,"z":"898d14e1.7672e8","wires":[["f19fbacf.0e6048"]]},{"id":"42f8276d.bd07d8","type":"ioBroker in","name":"command_DriveStop","topic":"node-red.0.Roomba.command_DriveStop","payloadType":"value","x":102,"y":426,"z":"898d14e1.7672e8","wires":[["c2538f0d.3dac7"]]},{"id":"c2538f0d.3dac7","type":"switch","name":"Wenn gesetzt","property":"payload","rules":[{"t":"eq","v":"1"}],"checkall":"true","outputs":1,"x":312,"y":426,"z":"898d14e1.7672e8","wires":[["ec479d75.13b86"]]},{"id":"ec479d75.13b86","type":"function","name":"Daten setzen","func":"msg.kommando = \"drivestop\"\nmsg.topic=\"command_DriveStop\";\nreturn msg;","outputs":1,"noerr":0,"x":479,"y":425,"z":"898d14e1.7672e8","wires":[["f19fbacf.0e6048"]]},{"id":"e6f764de.190898","type":"ioBroker in","name":"command_PowerOff","topic":"node-red.0.Roomba.command_PowerOff","payloadType":"value","x":107,"y":488,"z":"898d14e1.7672e8","wires":[["9557c46c.6aa838"]]},{"id":"9557c46c.6aa838","type":"switch","name":"Wenn gesetzt","property":"payload","rules":[{"t":"eq","v":"1"}],"checkall":"true","outputs":1,"x":317,"y":488,"z":"898d14e1.7672e8","wires":[["8a3d3738.75c2c8"]]},{"id":"8a3d3738.75c2c8","type":"function","name":"Daten setzen","func":"msg.kommando = \"poweroff\"\nmsg.topic=\"command_PowerOff\";\nreturn msg;","outputs":1,"noerr":0,"x":484,"y":487,"z":"898d14e1.7672e8","wires":[["f19fbacf.0e6048"]]}]
Dieser Flow hat einen Sub-Flow "Sub_Roomba_Steuerung", in dem UNBEDINGT in der Funktion "setzen" die IP-Adresse des Roomba eingetragen werden muss.
–------------------------------------------------------------------------
Der dritte und letzte Flow ist der "Roomba Status". Hiermit wird zeitgesteuert (ich habe derzeit jede Minute eingestellt) der Status des Roomba abgefragt und in die entsprechenden Datenpunkte geschrieben.
[{"id":"a5a2adf.f5a5d5","type":"inject","name":"Full Status jede 1 Minute","topic":"","payload":"","payloadType":"date","repeat":"60","crontab":"","once":true,"x":180,"y":62,"z":"7859072e.87a6f8","wires":[["504181f6.afbe8","182e191.fe7d1e7"]]},{"id":"504181f6.afbe8","type":"http request","name":"Roomba command","method":"GET","ret":"txt","url":"http://192.168.178.55/full_status.xml","x":408,"y":63,"z":"7859072e.87a6f8","wires":[["b7123aff.48edc8","3050ead5.cfaf16","6c22b045.93dd5","c8c15059.373eb","205772fb.dfa88e","bee92f3c.4116d","f8aef704.075108","a899536.f5766b","666e081d.9991f8"]]},{"id":"b7123aff.48edc8","type":"function","name":"Name auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<name>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":658,"y":63,"z":"7859072e.87a6f8","wires":[["5f503576.a0afcc"]]},{"id":"5f503576.a0afcc","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.name","ack":"false","autoCreate":"true","x":990,"y":64,"z":"7859072e.87a6f8","wires":[]},{"id":"3050ead5.cfaf16","type":"function","name":"Strecke auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<cleaning_distance>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":664,"y":133,"z":"7859072e.87a6f8","wires":[["b475f945.4b8a08"]]},{"id":"b475f945.4b8a08","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.strecke","ack":"false","autoCreate":"true","x":996,"y":134,"z":"7859072e.87a6f8","wires":[]},{"id":"6c22b045.93dd5","type":"function","name":"Schmutzbehälter auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<bin_status>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":693,"y":191,"z":"7859072e.87a6f8","wires":[["11db5550.ee24ab"]]},{"id":"11db5550.ee24ab","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.schmutzbehaelter","ack":"false","autoCreate":"true","x":1029,"y":193,"z":"7859072e.87a6f8","wires":[]},{"id":"c8c15059.373eb","type":"function","name":"Akkuladung auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<battery_charge>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":666,"y":259,"z":"7859072e.87a6f8","wires":[["8c8c5798.7373a8"]]},{"id":"8c8c5798.7373a8","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.akkuladung","ack":"false","autoCreate":"true","x":1030,"y":260,"z":"7859072e.87a6f8","wires":[]},{"id":"205772fb.dfa88e","type":"function","name":"Akkukapazität (Soll) auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<capacity>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":688,"y":319,"z":"7859072e.87a6f8","wires":[["5c1179c1.a3ee88"]]},{"id":"5c1179c1.a3ee88","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.akkusoll","ack":"false","autoCreate":"true","x":1036,"y":319,"z":"7859072e.87a6f8","wires":[]},{"id":"bee92f3c.4116d","type":"function","name":"Akkukapazität (Ist) auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<charge>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":690,"y":378,"z":"7859072e.87a6f8","wires":[["334dc150.ccb23e"]]},{"id":"334dc150.ccb23e","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.akkuist","ack":"false","autoCreate":"true","x":1026,"y":380,"z":"7859072e.87a6f8","wires":[]},{"id":"f8aef704.075108","type":"function","name":"Temperatur auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<temperature>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":692,"y":436,"z":"7859072e.87a6f8","wires":[["2712b369.d8ed4c"]]},{"id":"2712b369.d8ed4c","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.temperatur","ack":"false","autoCreate":"true","x":1028,"y":438,"z":"7859072e.87a6f8","wires":[]},{"id":"a899536.f5766b","type":"function","name":"Status auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<cleaner_state>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\n\nif (daten == \"st_base\"){\n daten = \"Auf Basis, nicht ladend\";\n}\n\nif (daten == \"st_base_recon\"){\n daten = \"Auf Basis, Auffrischungsladung\";\n}\n\nif (daten == \"st_base_full\"){\n daten = \"Auf Basis, normal aufladend\";\n}\n\nif (daten == \"st_base_trickle\"){\n daten = \"Auf Basis, Erhaltungsladung\";\n}\n\nif (daten == \"st_base_wait\"){\n daten = \"Auf Basis, wartend\";\n}\n\nif (daten == \"st_plug\"){\n daten = \"Eingesteckt, nicht ladend\";\n}\n\nif (daten == \"st_plug_recon\"){\n daten = \"Eingesteckt, Auffrischungsladung\";\n}\n\nif (daten == \"st_plug_full\"){\n daten = \"Eingesteckt, normal aufladend\";\n}\n\nif (daten == \"st_plug_trickle\"){\n daten = \"Eingesteckt, Erhaltungsladung\";\n}\n\nif (daten == \"st_plug_wait\"){\n daten = \"Eingesteckt, wartend\";\n}\n\nif (daten == \"st_stopped\"){\n daten = \"Angehalten\";\n}\n\nif (daten == \"st_clean\"){\n daten = \"Reinigung läuft\";\n}\n\nif (daten == \"st_cleanstop\"){\n daten = \"Reinigung gestoppt\";\n}\n\nif (daten == \"st_clean_spot\"){\n daten = \"Spot-Reinigung\";\n}\n\nif (daten == \"st_clean_max\"){\n daten = \"Max-Reinigung\";\n}\n\nif (daten == \"st_delayed\"){\n daten = \"Reinigung verzögert, startet gleich\";\n}\n\nif (daten == \"st_dock\"){\n daten = \"Suche Basis\";\n}\n\nif (daten == \"st_pickup\"){\n daten = \"Roomba hochgehoben\";\n}\n\nif (daten == \"st_remote\"){\n daten = \"Ferngesteuertes fahren\";\n}\n\nif (daten == \"st_wait\"){\n daten = \"Warte auf Befehle\";\n}\n\nif (daten == \"st_off\"){\n daten = \"Aus\";\n}\n\nif (daten == \"st_error\"){\n daten = \"Fehler\";\n}\n\nif (daten == \"st_locate\"){\n daten = \"Finde mich\";\n}\n\nif (daten == \"st_unknown\"){\n daten = \"Status unbekannt\";\n}\n\n\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":692,"y":497,"z":"7859072e.87a6f8","wires":[["f6e00de3.091ff"]]},{"id":"f6e00de3.091ff","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.status","ack":"false","autoCreate":"true","x":1028,"y":499,"z":"7859072e.87a6f8","wires":[]},{"id":"666e081d.9991f8","type":"function","name":"Saugt gerade auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<cleaning>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":706,"y":556,"z":"7859072e.87a6f8","wires":[["c7157fc8.38ea8"]]},{"id":"c7157fc8.38ea8","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.saugt","ack":"false","autoCreate":"true","x":1042,"y":558,"z":"7859072e.87a6f8","wires":[]},{"id":"182e191.fe7d1e7","type":"function","name":"Status-Uhrzeit ermitteln","func":"msg = {};\n\n\nfunction addZero(i) {\n if (i < 10) {\n i = \"0\" + i;\n }\n return i;\n}\n\n\nvar currentdate = new Date(); \nvar h = addZero(currentdate.getHours());\nvar m = addZero(currentdate.getMinutes());\nvar s = addZero(currentdate.getSeconds());\n\n\nvar datetime = h + \":\" + m + \":\" + s;\n\nmsg.payload = datetime;\nreturn msg;\n","outputs":1,"noerr":0,"x":701,"y":631,"z":"7859072e.87a6f8","wires":[["57efa4f2.a8105c"]]},{"id":"57efa4f2.a8105c","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.Statusuhrzeit","ack":"false","autoCreate":"true","x":1044,"y":636,"z":"7859072e.87a6f8","wires":[]}]</cleaning></cleaner_state></temperature></charge></capacity></battery_charge></bin_status></cleaning_distance></name>
Auch hier muss UNBEDINGT im Aufruf "Roomba command" die IP-Adresse des Roomba eingetragen werden.
Folgende Datenpunkte stehen zur Verfügung:
node-red.0.Roomba.name => Der vergebene Name der Roomba
node-red.0.Roomba.strecke => Gefahrene Strecke
node-red.0.Roomba.schmutzbehaelter => Schmutzbehälter voll
node-red.0.Roomba.akkuladung => Akkuladung in Prozent
node-red.0.Roomba.akkusoll => Akkuleistung (Soll-Wert, ausgelesen) im mA
node-red.0.Roomba.akkuist => Akkuleistung (Ist-Wert, gemessen) im mA
node-red.0.Roomba.temperatur => Temperatur im Roomba
node-red.0.Roomba.status => Status des Roomba (in Klartext)
node-red.0.Roomba.saugt => Soll angeben, ob der Roomba gerade saugt (funktioniert aber irgendwie nicht, stattdessen besser den Datenpunkt "node-red.0.Roomba.status" benutzen)
node-red.0.Roomba.Statusuhrzeit => Uhrzeit der Statusabfrage
–------------------------------------------------------------------------
Die Flows laufen seit einigen Tagen ohne Probleme bei mir.
Verbesserungen, Kommentare, usw. sind sehr willkommen.
Gruß,
Eric
-
Hallo,
Sobald mein RooWifi für meinen 870 da ist, wollte ich einen Adapter hierfür schreiben
Tobias
Gesendet von meinem VT10416-2 mit Tapatalk
-
Moin,
dann bin ich der erste, der den testen möchte
Adapter programmieren muss ich mir irgendwann auch mal ansehen … momentan stehe ich mir immer wieder selber im Weg
Gruß,
Eric
-
Ich werde den Adapter auch testen.
Der Roomba hat bisher bei mir nur WLAN, aber keine Einbindung in die Steuerung.
-
Übernimm einfach mal die Node-red Flows von mir - macht Spaß, den Roomba integriert zu wissen
Eine passende View (Wigdets) kann ich auch bereitstellen, wenn gewünscht.
Gruß,
Eric
-
Die Widgets interessieren mich auch.
Habe eben die flows importiert. dabei habe ich Fehler bekommen (iobroker input und output wären nicht vorhanden).
Suche nun den Fehler und schaue dann weiter.
-
hat sofort funktioniert! Super Beschreibung und Flow!!
Das Widget würde mich auch sehr interessieren!
mfg
Arminhh
-
So, dann hier die Widgets.
Die Steuerung:
[{"tpl":"tplFrame","data":{"visibility-cond":"==","visibility-val":1,"title":"Steuerung","title_color":"black","title_top":"5","title_left":"15","header_height":"30","header_color":"#a0c0ca"},"style":{"left":"560px","top":"60px","width":"345px","height":"423px","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","font-size":"large","z-index":"5"},"widgetSet":"basic"},{"tpl":"tplJquiButtonState","data":{"oid":"node-red.0.Roomba.command_Clean","visibility-cond":"==","visibility-val":1,"buttontext":"Normal saugen","padding":"5","value":"1"},"style":{"left":"590px","top":"120px","z-index":"20"},"widgetSet":"jqui"},{"tpl":"tplJquiButtonState","data":{"oid":"node-red.0.Roomba.command_SpotSaugen","visibility-cond":"==","visibility-val":1,"buttontext":"Spot saugen","padding":"5","value":"1"},"style":{"left":"590px","top":"170px","z-index":"20"},"widgetSet":"jqui"},{"tpl":"tplJquiButtonState","data":{"oid":"node-red.0.Roomba.command_MaxSaugen","visibility-cond":"==","visibility-val":1,"buttontext":"Max saugen","padding":"5","value":"1"},"style":{"left":"590px","top":"220px","z-index":"20"},"widgetSet":"jqui"},{"tpl":"tplJquiButtonState","data":{"oid":"node-red.0.Roomba.command_DriveStop","visibility-cond":"==","visibility-val":1,"buttontext":"Stop","padding":"5","value":"1"},"style":{"left":"590px","top":"290px","z-index":"20"},"widgetSet":"jqui"},{"tpl":"tplJquiButtonState","data":{"oid":"node-red.0.Roomba.command_PowerOff","visibility-cond":"==","visibility-val":1,"buttontext":"Power off","padding":"5","value":"1"},"style":{"left":"590px","top":"420px","z-index":"20"},"widgetSet":"jqui"},{"tpl":"tplJquiButtonState","data":{"oid":"node-red.0.Roomba.command_Findme","visibility-cond":"==","visibility-val":1,"buttontext":"Find me","padding":"5","value":"1"},"style":{"left":"730px","top":"420px","z-index":"20"},"widgetSet":"jqui"},{"tpl":"tplJquiButtonState","data":{"oid":"node-red.0.Roomba.command_BackToDock","visibility-cond":"==","visibility-val":1,"buttontext":"Zur Basis","padding":"5","value":"1"},"style":{"left":"590px","top":"370px","z-index":"20"},"widgetSet":"jqui"},{"tpl":"tplJquiButtonState","data":{"oid":"node-red.0.Roomba.command_LeaveDock","visibility-cond":"==","visibility-val":1,"buttontext":"Basis verlassen","padding":"5","value":"1"},"style":{"left":"730px","top":"370px","z-index":"20"},"widgetSet":"jqui"}]
Die Statusinfos:
[{"tpl":"tplFrame","data":{"visibility-cond":"==","visibility-val":1,"title":"Status","title_color":"black","title_top":"5","title_left":"15","header_height":"30","header_color":"#a0c0ca"},"style":{"left":"50px","top":"60px","width":"435px","height":"453px","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","font-size":"large","z-index":"5"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"nothing_selected","visibility-cond":"==","visibility-val":1,"html_prepend":"Akkustatus"},"style":{"left":"70px","top":"120px","width":"200px","height":"20px","color":"white","text-align":"left","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","z-index":"5"},"widgetSet":"basic"},{"tpl":"tplValueFloat","data":{"oid":"node-red.0.Roomba.akkuladung","visibility-cond":"==","visibility-val":1,"is_comma":"true","factor":"1","html_append_singular":" %","html_append_plural":" %"},"style":{"left":"360px","top":"120px","width":"100px","height":"22px","color":"white","text-align":"right","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","font-size":"large","z-index":"20"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"nothing_selected","visibility-cond":"==","visibility-val":1,"html_prepend":"Akkukapazität max."},"style":{"left":"70px","top":"160px","width":"200px","height":"20px","color":"white","text-align":"left","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","z-index":"5"},"widgetSet":"basic"},{"tpl":"tplValueFloat","data":{"oid":"node-red.0.Roomba.akkusoll","visibility-cond":"==","visibility-val":1,"is_comma":"true","factor":"1","html_append_singular":" mA","html_append_plural":" mA"},"style":{"left":"360px","top":"160px","width":"100px","height":"22px","color":"white","text-align":"right","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","font-size":"large","z-index":"20"},"widgetSet":"basic"},{"tpl":"tplValueFloat","data":{"oid":"node-red.0.Roomba.akkuist","visibility-cond":"==","visibility-val":1,"is_comma":"true","factor":"1","html_append_singular":" mA","html_append_plural":" mA"},"style":{"left":"360px","top":"190px","width":"100px","height":"22px","color":"white","text-align":"right","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","font-size":"large","z-index":"20"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"nothing_selected","visibility-cond":"==","visibility-val":1,"html_prepend":"Akkukapazität ist"},"style":{"left":"70px","top":"190px","width":"200px","height":"20px","color":"white","text-align":"left","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","z-index":"5"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"","visibility-cond":"==","visibility-val":1,"html_prepend":"Saugt gerade"},"style":{"left":"70px","top":"240px","width":"200px","height":"20px","color":"white","text-align":"left","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","z-index":"5"},"widgetSet":"basic"},{"tpl":"tplValueListHtml8","data":{"oid":"node-red.0.Roomba.saugt","visibility-cond":"==","visibility-val":1,"count":"1","value0":"Nein","value1":"Ja","style1":"background-color: green","style0":"background-color: red","value2":"Offen","style2":"background-color: red; padding:4px;","test_list":"0"},"style":{"left":"360px","top":"240px","color":"white","text-align":"center","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","font-size":"large","width":"100px","height":"22px","z-index":"20","overflow-x":""},"widgetSet":"basic"},{"tpl":"tplValueListHtml8","data":{"oid":"node-red.0.Roomba.schmutzbehaelter","visibility-cond":"==","visibility-val":1,"count":"1","value0":"Nein","value1":"Ja","style1":"background-color: red","style0":"background-color: green","value2":"Offen","style2":"background-color: red; padding:4px;","test_list":"0"},"style":{"left":"360px","top":"280px","color":"white","text-align":"center","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","font-size":"large","width":"100px","height":"22px","z-index":"20","overflow-x":""},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"","visibility-cond":"==","visibility-val":1,"html_prepend":"Staubbehälter voll"},"style":{"left":"70px","top":"280px","width":"200px","height":"20px","color":"white","text-align":"left","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","z-index":"5"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"","visibility-cond":"==","visibility-val":1,"html_prepend":"Status"},"style":{"left":"70px","top":"360px","width":"200px","height":"20px","color":"white","text-align":"left","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","z-index":"5"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"node-red.0.Roomba.status","visibility-cond":"==","visibility-val":1},"style":{"left":"140px","top":"360px","z-index":"20","color":"rgb(255, 255, 255)","text-align":"right","text-shadow":"none","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","font-size":"16px","line-height":"18px","letter-spacing":"0","word-spacing":"0px","width":"320px","height":"20px"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"nothing_selected","visibility-cond":"==","visibility-val":1,"html_prepend":"Gefahrene Strecke"},"style":{"left":"70px","top":"390px","width":"200px","height":"20px","color":"white","text-align":"left","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","z-index":"5"},"widgetSet":"basic"},{"tpl":"tplValueFloat","data":{"oid":"node-red.0.Roomba.strecke","visibility-cond":"==","visibility-val":1,"is_comma":"true","factor":"","html_append_singular":" m","html_append_plural":" m"},"style":{"left":"360px","top":"390px","width":"100px","height":"22px","color":"white","text-align":"right","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","font-size":"large","z-index":"20"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"nothing_selected","visibility-cond":"==","visibility-val":1,"html_prepend":"Temperatur"},"style":{"left":"70px","top":"420px","width":"200px","height":"20px","color":"white","text-align":"left","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","z-index":"5"},"widgetSet":"basic"},{"tpl":"tplValueFloat","data":{"oid":"node-red.0.Roomba.temperatur","visibility-cond":"==","visibility-val":1,"is_comma":"true","factor":"","html_append_singular":" ºC","html_append_plural":" ºC"},"style":{"left":"360px","top":"420px","width":"100px","height":"22px","color":"white","text-align":"right","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","font-size":"large","z-index":"20"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"node-red.0.Roomba.Statusuhrzeit","visibility-cond":"==","visibility-val":1,"html_prepend":"(Stand : ","html_append":")"},"style":{"left":"130px","top":"66px","color":"black","text-align":"left","width":"250px","height":"20px","z-index":"20","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-weight":"bold","font-size":"large"},"widgetSet":"basic"}]
Am node-red-Flow für die Statusinfos habe ich noch was angepasst - die Uhrzeit der Statusabfrage wird nun auch in einen Datenpunkt geschrieben und im Widget mit angezeigt. So sieht man immer, wie alt der angezeigte Status ist.
Hier der überarbeitete Flow "Roomba Status" (ist auch im Posting oben angepasst):
[{"id":"a5a2adf.f5a5d5","type":"inject","name":"Full Status jede 1 Minute","topic":"","payload":"","payloadType":"date","repeat":"60","crontab":"","once":true,"x":180,"y":62,"z":"7859072e.87a6f8","wires":[["504181f6.afbe8","182e191.fe7d1e7"]]},{"id":"504181f6.afbe8","type":"http request","name":"Roomba command","method":"GET","ret":"txt","url":"http://192.168.178.55/full_status.xml","x":408,"y":63,"z":"7859072e.87a6f8","wires":[["b7123aff.48edc8","3050ead5.cfaf16","6c22b045.93dd5","c8c15059.373eb","205772fb.dfa88e","bee92f3c.4116d","f8aef704.075108","a899536.f5766b","666e081d.9991f8"]]},{"id":"b7123aff.48edc8","type":"function","name":"Name auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<name>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":658,"y":63,"z":"7859072e.87a6f8","wires":[["5f503576.a0afcc"]]},{"id":"5f503576.a0afcc","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.name","ack":"false","autoCreate":"true","x":990,"y":64,"z":"7859072e.87a6f8","wires":[]},{"id":"3050ead5.cfaf16","type":"function","name":"Strecke auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<cleaning_distance>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":664,"y":133,"z":"7859072e.87a6f8","wires":[["b475f945.4b8a08"]]},{"id":"b475f945.4b8a08","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.strecke","ack":"false","autoCreate":"true","x":996,"y":134,"z":"7859072e.87a6f8","wires":[]},{"id":"6c22b045.93dd5","type":"function","name":"Schmutzbehälter auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<bin_status>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":693,"y":191,"z":"7859072e.87a6f8","wires":[["11db5550.ee24ab"]]},{"id":"11db5550.ee24ab","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.schmutzbehaelter","ack":"false","autoCreate":"true","x":1029,"y":193,"z":"7859072e.87a6f8","wires":[]},{"id":"c8c15059.373eb","type":"function","name":"Akkuladung auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<battery_charge>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":666,"y":259,"z":"7859072e.87a6f8","wires":[["8c8c5798.7373a8"]]},{"id":"8c8c5798.7373a8","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.akkuladung","ack":"false","autoCreate":"true","x":1030,"y":260,"z":"7859072e.87a6f8","wires":[]},{"id":"205772fb.dfa88e","type":"function","name":"Akkukapazität (Soll) auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<capacity>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":688,"y":319,"z":"7859072e.87a6f8","wires":[["5c1179c1.a3ee88"]]},{"id":"5c1179c1.a3ee88","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.akkusoll","ack":"false","autoCreate":"true","x":1036,"y":319,"z":"7859072e.87a6f8","wires":[]},{"id":"bee92f3c.4116d","type":"function","name":"Akkukapazität (Ist) auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<charge>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":690,"y":378,"z":"7859072e.87a6f8","wires":[["334dc150.ccb23e"]]},{"id":"334dc150.ccb23e","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.akkuist","ack":"false","autoCreate":"true","x":1026,"y":380,"z":"7859072e.87a6f8","wires":[]},{"id":"f8aef704.075108","type":"function","name":"Temperatur auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<temperature>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":692,"y":436,"z":"7859072e.87a6f8","wires":[["2712b369.d8ed4c"]]},{"id":"2712b369.d8ed4c","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.temperatur","ack":"false","autoCreate":"true","x":1028,"y":438,"z":"7859072e.87a6f8","wires":[]},{"id":"a899536.f5766b","type":"function","name":"Status auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<cleaner_state>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\n\nif (daten == \"st_base\"){\n daten = \"Auf Basis, nicht ladend\";\n}\n\nif (daten == \"st_base_recon\"){\n daten = \"Auf Basis, Auffrischungsladung\";\n}\n\nif (daten == \"st_base_full\"){\n daten = \"Auf Basis, normal aufladend\";\n}\n\nif (daten == \"st_base_trickle\"){\n daten = \"Auf Basis, Erhaltungsladung\";\n}\n\nif (daten == \"st_base_wait\"){\n daten = \"Auf Basis, wartend\";\n}\n\nif (daten == \"st_plug\"){\n daten = \"Eingesteckt, nicht ladend\";\n}\n\nif (daten == \"st_plug_recon\"){\n daten = \"Eingesteckt, Auffrischungsladung\";\n}\n\nif (daten == \"st_plug_full\"){\n daten = \"Eingesteckt, normal aufladend\";\n}\n\nif (daten == \"st_plug_trickle\"){\n daten = \"Eingesteckt, Erhaltungsladung\";\n}\n\nif (daten == \"st_plug_wait\"){\n daten = \"Eingesteckt, wartend\";\n}\n\nif (daten == \"st_stopped\"){\n daten = \"Angehalten\";\n}\n\nif (daten == \"st_clean\"){\n daten = \"Reinigung läuft\";\n}\n\nif (daten == \"st_cleanstop\"){\n daten = \"Reinigung gestoppt\";\n}\n\nif (daten == \"st_clean_spot\"){\n daten = \"Spot-Reinigung\";\n}\n\nif (daten == \"st_clean_max\"){\n daten = \"Max-Reinigung\";\n}\n\nif (daten == \"st_delayed\"){\n daten = \"Reinigung verzögert, startet gleich\";\n}\n\nif (daten == \"st_dock\"){\n daten = \"Suche Basis\";\n}\n\nif (daten == \"st_pickup\"){\n daten = \"Roomba hochgehoben\";\n}\n\nif (daten == \"st_remote\"){\n daten = \"Ferngesteuertes fahren\";\n}\n\nif (daten == \"st_wait\"){\n daten = \"Warte auf Befehle\";\n}\n\nif (daten == \"st_off\"){\n daten = \"Aus\";\n}\n\nif (daten == \"st_error\"){\n daten = \"Fehler\";\n}\n\nif (daten == \"st_locate\"){\n daten = \"Finde mich\";\n}\n\nif (daten == \"st_unknown\"){\n daten = \"Status unbekannt\";\n}\n\n\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":692,"y":497,"z":"7859072e.87a6f8","wires":[["f6e00de3.091ff"]]},{"id":"f6e00de3.091ff","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.status","ack":"false","autoCreate":"true","x":1028,"y":499,"z":"7859072e.87a6f8","wires":[]},{"id":"666e081d.9991f8","type":"function","name":"Saugt gerade auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<cleaning>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":706,"y":556,"z":"7859072e.87a6f8","wires":[["c7157fc8.38ea8"]]},{"id":"c7157fc8.38ea8","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.saugt","ack":"false","autoCreate":"true","x":1042,"y":558,"z":"7859072e.87a6f8","wires":[]},{"id":"182e191.fe7d1e7","type":"function","name":"Status-Uhrzeit ermitteln","func":"msg = {};\n\n\nfunction addZero(i) {\n if (i < 10) {\n i = \"0\" + i;\n }\n return i;\n}\n\n\nvar currentdate = new Date(); \nvar h = addZero(currentdate.getHours());\nvar m = addZero(currentdate.getMinutes());\nvar s = addZero(currentdate.getSeconds());\n\n\nvar datetime = h + \":\" + m + \":\" + s;\n\nmsg.payload = datetime;\nreturn msg;\n","outputs":1,"noerr":0,"x":701,"y":631,"z":"7859072e.87a6f8","wires":[["57efa4f2.a8105c"]]},{"id":"57efa4f2.a8105c","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.Statusuhrzeit","ack":"false","autoCreate":"true","x":1044,"y":636,"z":"7859072e.87a6f8","wires":[]}]</cleaning></cleaner_state></temperature></charge></capacity></battery_charge></bin_status></cleaning_distance></name>
Viel Spaß damit
Gruß,
Eric
-
Welche Roombas gehen denn per WLAN? und wo gibt's das WLAN-Modul?
Gruß
Rainer
-
Such mal nach roowifi im Netz. Bestellt habe ich das Modul vor 3 Wochen, aber erhalten habe ich es noch nicht. Daher kann ich noch keine Aussage dazu machen.
Gesendet von meinem VT10416-2 mit Tapatalk
-
Hallo Rainer,
Welche Roombas gehen denn per WLAN? und wo gibt's das WLAN-Modul? `
derzeit geht die 500/600er-Serie und für die 700/800er-Serie ist gerade auf Kickstarter wieder ein Projekt gestartet => Infos hier : http://www.thinkingcleaner.comIn Deutschland kannst Du das WLAN-Modul hier kaufen => http://www.homewizard.de/thinking-clean … 00-eu.html
Da habe ich meinen auch bestellt (ohne Versandkosten). Ging sehr zügig.
Gruß,
Eric
-
Ich kann die flows nicht testen. Suche immer noch nach den verlorenen nodes in/out.
Noch fehlt mir die Idee für eine Lösung.
-
Moin,
hast Du den node-red-Adapter schon deinstalliert und neu installiert?
Gruß,
Eric
-
Frage:
ist dieser Robi dafür brauchbar?
http://onlineshop.real.de/Saugroboter-R … 8947001001
oder
http://www.comtech.de/Markenshops/iRobo ... augroboter
Gruß
Jürgen
-
Ich habe einen 870 und bin voll zufrieden.
Meiner Meinung nach sind die räumlichen Gegebenheiten viel wichtiger als das Modell.
Wenn z.B.
-
Treppen vorhanden sind
-
Gardinen bis auf den Boden reichen
-
Kabel herum liegen
-
Der sauger sich unter niedrigen Möbelstücken verklemmt
-
Teppichfranzen
-…
Dann ist der Spass schnell vorbei. Daher sollte man sich so ein Gerät da bestellen, wo man es auch ohne Probleme zurück geben kann
Tobias
Gesendet von meinem VT10416-2 mit Tapatalk
-
-
Cool, endlich ist der Roomba in der Haussteuerung.
-
moin
ich habe mir gerade eine Szene erstellt wenn der Staubbehälter voll ist, das ich eine Nachricht bekomme. Funktioniert auch soweit, ausser das nach dem leeren die Variable nicht zurückgesetzt wird. Hat der Staubbehälter einen Sensor? Wenn ja wo? Oder wie wird der Füllstand sonst ausgewertet?
mfg
Armin
-
Moin,
eh, … bei mir wird die Variable (aus dem Flow) zurückgesetzt ... allerdings habe ich noch nie darauf geachtet, wann.
Evtl. nach dem nächsten Clean-Start?
Mal probieren.
Ist die Verarbeitung über eine Szene einfacher, als über einen Flow?
Ich habe mich noch nicht mit den Szenen befasst, daher meine Frage.
Gruß,
Eric
-
@eric2905 sagte in IRobot Roomba Steuerung:
Am node-red-Flow für die Statusinfos habe ich noch was angepasst - die Uhrzeit der Statusabfrage wird nun auch in einen Datenpunkt geschrieben und im Widget mit angezeigt. So sieht man immer, wie alt der angezeigte Status ist.
Hier der überarbeitete Flow "Roomba Status" (ist auch im Posting oben angepasst):
[{"id":"a5a2adf.f5a5d5","type":"inject","name":"Full Status jede 1 Minute","topic":"","payload":"","payloadType":"date","repeat":"60","crontab":"","once":true,"x":180,"y":62,"z":"7859072e.87a6f8","wires":[["504181f6.afbe8","182e191.fe7d1e7"]]},{"id":"504181f6.afbe8","type":"http request","name":"Roomba command","method":"GET","ret":"txt","url":"http://192.168.178.55/full_status.xml","x":408,"y":63,"z":"7859072e.87a6f8","wires":[["b7123aff.48edc8","3050ead5.cfaf16","6c22b045.93dd5","c8c15059.373eb","205772fb.dfa88e","bee92f3c.4116d","f8aef704.075108","a899536.f5766b","666e081d.9991f8"]]},{"id":"b7123aff.48edc8","type":"function","name":"Name auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<name>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":658,"y":63,"z":"7859072e.87a6f8","wires":[["5f503576.a0afcc"]]},{"id":"5f503576.a0afcc","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.name","ack":"false","autoCreate":"true","x":990,"y":64,"z":"7859072e.87a6f8","wires":[]},{"id":"3050ead5.cfaf16","type":"function","name":"Strecke auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<cleaning_distance>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":664,"y":133,"z":"7859072e.87a6f8","wires":[["b475f945.4b8a08"]]},{"id":"b475f945.4b8a08","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.strecke","ack":"false","autoCreate":"true","x":996,"y":134,"z":"7859072e.87a6f8","wires":[]},{"id":"6c22b045.93dd5","type":"function","name":"Schmutzbehälter auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<bin_status>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":693,"y":191,"z":"7859072e.87a6f8","wires":[["11db5550.ee24ab"]]},{"id":"11db5550.ee24ab","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.schmutzbehaelter","ack":"false","autoCreate":"true","x":1029,"y":193,"z":"7859072e.87a6f8","wires":[]},{"id":"c8c15059.373eb","type":"function","name":"Akkuladung auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<battery_charge>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":666,"y":259,"z":"7859072e.87a6f8","wires":[["8c8c5798.7373a8"]]},{"id":"8c8c5798.7373a8","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.akkuladung","ack":"false","autoCreate":"true","x":1030,"y":260,"z":"7859072e.87a6f8","wires":[]},{"id":"205772fb.dfa88e","type":"function","name":"Akkukapazität (Soll) auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<capacity>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":688,"y":319,"z":"7859072e.87a6f8","wires":[["5c1179c1.a3ee88"]]},{"id":"5c1179c1.a3ee88","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.akkusoll","ack":"false","autoCreate":"true","x":1036,"y":319,"z":"7859072e.87a6f8","wires":[]},{"id":"bee92f3c.4116d","type":"function","name":"Akkukapazität (Ist) auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<charge>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":690,"y":378,"z":"7859072e.87a6f8","wires":[["334dc150.ccb23e"]]},{"id":"334dc150.ccb23e","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.akkuist","ack":"false","autoCreate":"true","x":1026,"y":380,"z":"7859072e.87a6f8","wires":[]},{"id":"f8aef704.075108","type":"function","name":"Temperatur auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<temperature>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":692,"y":436,"z":"7859072e.87a6f8","wires":[["2712b369.d8ed4c"]]},{"id":"2712b369.d8ed4c","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.temperatur","ack":"false","autoCreate":"true","x":1028,"y":438,"z":"7859072e.87a6f8","wires":[]},{"id":"a899536.f5766b","type":"function","name":"Status auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<cleaner_state>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\n\nif (daten == \"st_base\"){\n daten = \"Auf Basis, nicht ladend\";\n}\n\nif (daten == \"st_base_recon\"){\n daten = \"Auf Basis, Auffrischungsladung\";\n}\n\nif (daten == \"st_base_full\"){\n daten = \"Auf Basis, normal aufladend\";\n}\n\nif (daten == \"st_base_trickle\"){\n daten = \"Auf Basis, Erhaltungsladung\";\n}\n\nif (daten == \"st_base_wait\"){\n daten = \"Auf Basis, wartend\";\n}\n\nif (daten == \"st_plug\"){\n daten = \"Eingesteckt, nicht ladend\";\n}\n\nif (daten == \"st_plug_recon\"){\n daten = \"Eingesteckt, Auffrischungsladung\";\n}\n\nif (daten == \"st_plug_full\"){\n daten = \"Eingesteckt, normal aufladend\";\n}\n\nif (daten == \"st_plug_trickle\"){\n daten = \"Eingesteckt, Erhaltungsladung\";\n}\n\nif (daten == \"st_plug_wait\"){\n daten = \"Eingesteckt, wartend\";\n}\n\nif (daten == \"st_stopped\"){\n daten = \"Angehalten\";\n}\n\nif (daten == \"st_clean\"){\n daten = \"Reinigung läuft\";\n}\n\nif (daten == \"st_cleanstop\"){\n daten = \"Reinigung gestoppt\";\n}\n\nif (daten == \"st_clean_spot\"){\n daten = \"Spot-Reinigung\";\n}\n\nif (daten == \"st_clean_max\"){\n daten = \"Max-Reinigung\";\n}\n\nif (daten == \"st_delayed\"){\n daten = \"Reinigung verzögert, startet gleich\";\n}\n\nif (daten == \"st_dock\"){\n daten = \"Suche Basis\";\n}\n\nif (daten == \"st_pickup\"){\n daten = \"Roomba hochgehoben\";\n}\n\nif (daten == \"st_remote\"){\n daten = \"Ferngesteuertes fahren\";\n}\n\nif (daten == \"st_wait\"){\n daten = \"Warte auf Befehle\";\n}\n\nif (daten == \"st_off\"){\n daten = \"Aus\";\n}\n\nif (daten == \"st_error\"){\n daten = \"Fehler\";\n}\n\nif (daten == \"st_locate\"){\n daten = \"Finde mich\";\n}\n\nif (daten == \"st_unknown\"){\n daten = \"Status unbekannt\";\n}\n\n\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":692,"y":497,"z":"7859072e.87a6f8","wires":[["f6e00de3.091ff"]]},{"id":"f6e00de3.091ff","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.status","ack":"false","autoCreate":"true","x":1028,"y":499,"z":"7859072e.87a6f8","wires":[]},{"id":"666e081d.9991f8","type":"function","name":"Saugt gerade auswerten","func":"var quelle = msg.payload;\n\nmsg1 = {};\n\nsuche = \"<cleaning>\";\nsuche_laenge = (suche && suche.length);\n\n// Suchwort \"suche\" finden \n// var daten_startpos = quelle.indexOf('cleaning_distance');\nvar daten_startpos = quelle.indexOf(suche);\nvar daten = quelle.substr(daten_startpos + suche_laenge, 50);\n\n// Finde \"<\" und merke dir die Position. Schneide aus von 0 bis Position\nvar daten_endpos = daten.indexOf('<');\ndaten = daten.substring(0, daten_endpos);\nmsg1.payload = daten; // String\n\nreturn [msg1];","outputs":"1","noerr":0,"x":706,"y":556,"z":"7859072e.87a6f8","wires":[["c7157fc8.38ea8"]]},{"id":"c7157fc8.38ea8","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.saugt","ack":"false","autoCreate":"true","x":1042,"y":558,"z":"7859072e.87a6f8","wires":[]},{"id":"182e191.fe7d1e7","type":"function","name":"Status-Uhrzeit ermitteln","func":"msg = {};\n\n\nfunction addZero(i) {\n if (i < 10) {\n i = \"0\" + i;\n }\n return i;\n}\n\n\nvar currentdate = new Date(); \nvar h = addZero(currentdate.getHours());\nvar m = addZero(currentdate.getMinutes());\nvar s = addZero(currentdate.getSeconds());\n\n\nvar datetime = h + \":\" + m + \":\" + s;\n\nmsg.payload = datetime;\nreturn msg;\n","outputs":1,"noerr":0,"x":701,"y":631,"z":"7859072e.87a6f8","wires":[["57efa4f2.a8105c"]]},{"id":"57efa4f2.a8105c","type":"ioBroker out","name":"","topic":"node-red.0.Roomba.Statusuhrzeit","ack":"false","autoCreate":"true","x":1044,"y":636,"z":"7859072e.87a6f8","wires":[]}]</cleaning></cleaner_state></temperature></charge></capacity></battery_charge></bin_status></cleaning_distance></name>
Viel Spaß damit
Gruß,
Eric
Hallo @eric2905,
beim Importieren des Roomba Status Flows in NodeRed kommt bei mir folgende Fehlermeldung:
Was mache ich da falsch? Wo liegt der Fehler?
EDIT:
Es darf</cleaning></cleaner_state></temperature></charge></capacity></battery_charge></bin_status></cleaning_distance></name>
nicht enthalten sein.
Ein Problem habe ich aber trotzdem noch.
Ich habe wie beschrieben unter "Roomba command" meine IP Adresse des Saugroboters eingetragen, aber nach dem Deployen bekommt Node Red keine Verbindung. (siehe Bild) So wie es aussieht ist diese Verbindung nicht möglich.Der Aufruf dieses Links http://192.168.178.253/full_status.xml ist nicht möglich.
Im Log steht folgende Fehlermeldung:
Was ist da falsch? Was muss ich da machen?