NEWS
JSON Array auslesen: Blockly, JavaScript, NodeRed
-
Hallo,
würde Hilfe beim Export der Daten des Reinigungsplans meines Ecovacs Saugroboters brauchen.
Die Reinigungszeiten, Tage, usw. befinden sich im JSON Format.
Es gibt viele Anleitungen, aber keine die sich mit einen Array im JSON befasst.Das JSON sieht wie folgt aus:
[{"sid":"timing_name_648006833100","cleanCtl":{"type":"SpotArea","spotAreas":"0,2"},"enabled":true,"onlyOnce":false,"weekdays":{"Mon":false,"Tue":true,"Wed":true,"Thu":false,"Fri":true,"Sat":true,"Sun":true},"hour":"19","minute":"0"},{"sid":"timing_name_720007986100","cleanCtl":{"type":"SpotArea","spotAreas":"4,6"},"enabled":true,"onlyOnce":false,"weekdays":{"Mon":false,"Tue":false,"Wed":false,"Thu":false,"Fri":true,"Sat":false,"Sun":true},"hour":"20","minute":"0"},{"sid":"timing_name_630005676100","cleanCtl":{"type":"SpotArea","spotAreas":"4"},"enabled":true,"onlyOnce":false,"weekdays":{"Mon":false,"Tue":false,"Wed":false,"Thu":true,"Fri":false,"Sat":false,"Sun":false},"hour":"17","minute":"30"}]
Hier sieht man einige Daten als Bild:
Weiß jemand wie ich verschiedene Datenpunkte rausholen kann?
Am besten wäre es, wenn man die Anzahl der Reinigungsprogramme auch zählen lassen könnte.
Würde gerne einzele Datenpunkte beschreiben und diese dann in der Vis anzeigen lassen.Wenn jemanden eine andere und bessere Idee hat, jederzeit her damit.
Vielen Dank jetzt schon mal an Alle!
Gruß Dominik
-
-
Wenn ihr nicht immer an Eurem Blockly hängen würdet, hätte ich ja eine fertige Lösung.
Obiges Array in Datenpunkten:
aber halt mit einer "besseren" Logikmaschine.
- Hilft Dir zwar jetzt nichts - aber vielleicht solltest Du Dir doch mal überlegen, ob Du nicht zumindest 2 gleisig fahren willst.
-
@domi920 sagte: Das JSON sieht wie folgt aus:
Beispiel, wie man für jedes Reinigungsprogramm einen String mit den zugehörigen Wochentagen erhält (Debug zeigt den String):
Weitere Informationen aus der Variable
obj
zu ermitteln, dürfte nicht schwer fallen.@domi920 sagte in JSON Array mit Hilfe von Blockly pharsen, Daten auslesen:
Anzahl der Reinigungsprogramme auch zählen lassen könnte.
"Länge von Liste" liefert die Anzahl.
-
Vielen Dank für die großartige Hilfsbereitschaft an alle!
@mickym deine Lösung sieht im Ergebnis echt super aus! Würde gerne dein Skript mal testen wenn du es zur Verfügung stellst.
Es wäre in der Tat eine Überlegung Wert zweigleisig ink. Blockly zu fahren.@paul53 danke für das tolle Blockly! Es ist sehr gut nachvollziehbar was gemacht wird und man weiß wie man es erweitern kann!
-
@domi920 sagte in JSON Array mit Hilfe von Blockly pharsen, Daten auslesen:
Vielen Dank für die großartige Hilfsbereitschaft an alle!
@mickym deine Lösung sieht im Ergebnis echt super aus! Würde gerne dein Skript mal testen wenn du es zur Verfügung stellst.
Es wäre in der Tat eine Überlegung Wert zweigleisig ink. Blockly zu fahren.@paul53 danke für das tolle Blockly! Es ist sehr gut nachvollziehbar was gemacht wird und man weiß wie man es erweitern kann!
Aber klar doch - mein Script ist ein NodeRed Flow.
Aber ich mach noch ein paar Videos für Dich, damit Du weißt wie toll integrativ der iobroker ist und man eben nicht auf Blockly festgelegt sein muss.
-
@mickym vielen Dank!
NodeRed hab ich zum Glück schon im Einsatz, weil da meine virtuellen Alexa Smart Home Geräte sind.Auf das Video bin ich sehr gespannt!
-
@domi920 sagte in JSON Array mit Hilfe von Blockly pharsen, Daten auslesen:
@mickym vielen Dank!
NodeRed hab ich zum Glück schon im Einsatz, weil da meine virtuellen Alexa Smart Home Geräte sind.Auf das Video bin ich sehr gespannt!
So ich hoffe, Du nimmst es etwas mit Humor und verzeihst meine nicht ganz perfekten Versuche im Video die beiden Fenster parallel darzustellen. Ich wußte ja nicht, dass Du dieses hervorragende Tool mit den roten Knoten schon im Einsatz hast, weil ihr halt immer Blockly in Euren Threads schreibt.
Im Prinzip brauchst Du Video 2 ja dann nicht mehr.
Hier mal die Videos:
1. BlocklyFan schreibt JSON-string.mp4
2. BlocklyFan probiert mal was Neues.mp4
3. BlocklyFan importiert 1. Node Red Flow und ist begeistert.mp4
4. BlocklyFan ändert JSON String und Datenpunkte werden aktualisiert.mp4Ach und weil Du den NodeRed Adapter schon im Einsatz hast, der Flow funktioniert nur, wenn Du in der Adapterkonfiguration (wie im Video 2 dargestellt), das Erstellen von Fremdobjekten zu lässt (anhakst).
-
@mickym Natürlich nehme ich deine Nachricht mit Humor
Dein Humor & vor allem deine Hilfe ist exzellent!
Ich glaube, dass viele Leute hier lieber Blockly haben, weil sie NodeRed nicht kennen. Ich selbst habe es auch nur wegen AlexaWenn wir noch den Feinschliff machen könnten, wär ich nur noch glücklich:
Wie bzw. wo kann man den Pfad von0_userdata.0.saugroboter.
ändern?
Muss der JSON im gleichen Ordner sein, oder ist es auch in Ordnung, wenn dieser im Ordner vom Saugroboter ist?
Wenn ich das richtig sehe, kann man in NodeRed im "Eingangs-Datenpunkt" einstellen, ob dieser nur auf bestätigte oder egal reagiert, oder?
-
@domi920 Also eigene Daten schreiben sollte man immer unter 0_userdata.0 - deswegen habe ich das auch so fest codiert.
So nun zu Deinen Fragen:
- Nein den JSON kannst Du herausholen woher Du willst (ist in der iobroker IN Node festgelegt) - der Flow läuft immer von links nach rechts wie beim Lesen. Also Eingang (iobroker-IN) - Subflow ist Bearbeitung - Ausgang ist iobrokerOut:
Einfach bei Topic den richtigen Pfad reinkopieren in die iobroker-IN Node
-
Das ACK - Flag entspricht dem Blockly egal=Send all events, bestätigt = Only updates, unbestätigt = only commands
-
Den Ausgang muss wie gesagt direkt unter 0_userdata.0 liegen - da dies der vorgesehene Punkt ist, um eigene Datenpunkte zu erstellen:
Wie der oberste Punkte heißen soll, kannst Du in meiner Subflow Node festlegen:
Du kannst da auch tiefer liegende Punkte nehmen, wie wohnung.saugroboter.
-
@mickym Habs gerade durch etwas rumprobieren selbst rausgefunden. Aber da bin ich noch am Screenshots machen, bekomme ich von dir schon die Meisterlösung!
Respekt!Nur noch kurz am Rande, weißt Du zufälligerweise, wie man die Zeitpläne zählen kann? Also sprich wie viele Ordner erstellt wurden?
Wobei es dann auch wichtig wäre, dass die Ordner gelöscht werden, wenn eine Reinigungsaufgabe gelöscht wird und das JSON dementsprechend aktualisiert wird.
Was meinst Du? Ist das möglich, oder überhaupt sinnvoll? -
Muss jetzt leider los zur Arbeit...
Werde die Beiträge Nachmittags sehen, bin aber schon sehr gespannt!Nochmals vielen Dank!
-
@domi920 Also löschen geht meines Erachten im iobroker generell schlecht (unabhängig von Blockly oder NodeRed) - da musst Du dann wirklich Javascript bemühen - da muss man in der Objektdatenbank rumpfuschen - Das ist generell nicht vorgesehen.
Die aktiven Pläne musst Du dann wie gesagt über die Anzahl der Array-Elemente ermitteln oder über den Datenpunkt enabled=true in den jeweiligen Programmen.Entweder nimmst Du die Lösung von @paul53 und schreibst die Anzahl in einen eigenen Datenpunkt oder natürlich kannst Du das auch mit NodeRed machen und das ebenfalls wegschreiben.
Also 3 aktive Pläne - 0,1,2
Ansonsten frohes Schaffen.
-
@domi920 sagte in JSON Array mit Hilfe von Blockly pharsen, Daten auslesen:
@mickym Habs gerade durch etwas rumprobieren selbst rausgefunden. Aber da bin ich noch am Screenshots machen, bekomme ich von dir schon die Meisterlösung!
Respekt!Nur noch kurz am Rande, weißt Du zufälligerweise, wie man die Zeitpläne zählen kann? Also sprich wie viele Ordner erstellt wurden?
Wobei es dann auch wichtig wäre, dass die Ordner gelöscht werden, wenn eine Reinigungsaufgabe gelöscht wird und das JSON dementsprechend aktualisiert wird.
Was meinst Du? Ist das möglich, oder überhaupt sinnvoll?Na in dem Fall ist Blockly - bzw. der Javascript Adapter dem NodeRed Adapter überlegen.
- Aber wir haben ja den iobroker, der aus beiden Welten das Zusammenspiel perfekt macht.
hier mal die Javascript-Funktion aus Blockly heraus, die zum Beispiel den Folder 2 löscht.
Wie gesagt - ich weiß aber nicht, ob das sinnvoll ist. In meinen Augen sind das ja nur die Reinigungsprogramme und das sagt meines Erachtens nichts über den Vollzug aus. Du kannst nur - wie beschrieben die Elemente zählen und die überzähligen dann ggf. Löschen - um das 1:1 mit dem Gerät zu halten.
-
OK - ich glaub ich hab es Dir nun rund gemacht - mit der Visualisierung musst Dich aber nun selbst kümmern.
Ich muss aber wieder mal zugeben, dass mir die letzte Stunde, das Blockly den letzten Nerv gekostet hat:
Diese blöde Schleife hat auch gezählt wenn der neue Wert GRÖSSER als der vorherige Wert war, obwohl die Schrittweite positiv war.
Wenn ich also meine Zähler i von 4 nach 3 in Schritten von +1 - bin ich davon ausgegangen, dass die Schleife gar nicht ausgeführt wird. Anstelle dessen wir im Javascript Code eine Prüfung gemacht und diese immer ausgeführt also rückwärts und vorwärts. Sowas finde ich echt ätzend.
Na wenn mans weiß, macht man halt so ein Bedingung vorne dran.
So der ganze Zyklus sieht nun so aus. Wo immer Dein Array mit den Staubsauger-Programmen herkommt, triggert dies den NodeRed Flow. Dieser Schreibt nun die Datenpunkte und zählt gleichzeitig die aktiven Programme und schreibt diese in einen Datenpunkt active:
Hier der Flow:
Nur wenn sich diese Anzahl in saugroboter.active ÄNDERT wird dann das Blockly getriggert und dann auch nur was gemacht, wenn dieser Wert kleiner dem vorherigen war.
Ist dies der Fall, werden die überschüssigen Instanzen (Folder) aus dem Objektbaum gelöscht.
Einerseits zwar schade, dass man nicht ohne Blockly auskommt, andererseits ist es perfektes Beispiel wie die beiden Tools aus 2 Welten im iobroker zusammen arbeiten können.
EDIT: Und die aktuelles JS Doku zufinden - ist auch ein Kampf - wenn man das nicht jeden Tag braucht - sollte irgendwie in der aktuellen Doku irgendwo verlinkt sein:
https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#deleteobjectund Achtung - ich habe die "very dangerous" Variante in dem Blockly verwendet.
Es wurden also verwendet bei dieser Logik:
- NodeRed
- Blockly
- JavaScript
Ach und vielleicht solltest Du die Überschrift des Threadtitels anpassen.
-
@mickym ich bin sprachlos begeistert!
Da hast du wirklich das Non-Plus-Ultra vorgelegt!
Und vor allem einfach, nachvollziehbar & detailliert beschriebenWerde Deine Vorlage noch ausgiebig testen und mich dann nochmal melden, falls noch was sein sollte.
Nachdem ich bei mir alles zufriedenstellend integriert habe, werde ich den Entwickler vom Ecovacs Adapter kontaktieren und dies verlinken.
Denke es könnte für viele eine große Hilfe sein.Vielen vielen Dank nochmal für Deine Kompetenz!
Ich hoffe der Titel bzw. die Überschrift ist passend. Falls nich nehme ich gerne Vorschläge an
Gruß Dominik