NEWS
Alle Datenpunkte umziehen und Skripte automatisiert anpassen
-
Ich hab hier eine relativ alte ioB installation und alle Datenpunkte sind noch im javascript Ordner angelegt. userdata gabs damals noch gar nicht.
Ich hatte schon länger vor, das ganze mal zu bereinigen und hab mich die Tage mal dran gesetzt.
Ein Skript, dass mir alle Datenpunkte ausliest und mit den gleichen Eigenschaften (also type, desc, min, max, custom usw) unter userdata anlegt hab ich schon und das funktioniert auch problemlos.
Meine Skripte sind fast alle in Blockly geschrieben und die müssen natürlich auch angepasst werden. Meine Idee war, ich exportiere alle Skripte, ersetze dann einfach in den exportierten Daten "javascript.0.Datenpunkte" mit "0_userdata_0" und importiere dann alle Skripte wieder. Das funktioniert aber nicht, weil die Blocklyinformationen anscheinend kodiert (Base64 ?) im letzten Kommentar stehen.
Dekodiere ich diesen Kommentar, dann kann man zwar halbwegs Code erkennen, aber es werden auch viele "nicht sprechende" IDs benutzt.Daher hier meine Frage, hat jemand ne Idee, wie ich in einem Batchjob in allen Skripten den Pfad zu meinen Datenpunkten austauschen kann?
Das muss nicht zwingend mit ioB Bordmitteln sein, gerne auch über Export/Import oder wie auch immer. -
@mlapp
wenn du das dekodierst hast du eine URL-kodierte XML-Datenstruktur, da nochmal dekodieren zu xml und dann bearbeiten und wieder zurück. vielleicht hilft es ja.JTNDeG1sJTIweG1sbnMlM0QlMjJodHRwcyUzQSUyRiUyRmRldmVsb3BlcnMuZ29vZ2xlLmNvbSUyRmJsb2NrbHklMkZ4bWwlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb250cm9sJTIyJTIwaWQlM0QlMjJBJTVEXyUzQlpNViU1QjElMkZSX1gxWVEhVyU1Ql8lMjIlMjB4JTNEJTIyODglMjIlMjB5JTNEJTIyMjYyJTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwZGVsYXlfaW5wdXQlM0QlMjJmYWxzZSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyT0lEJTIyJTNFMF91c2VyZGF0YS4wLkR1bW15cy5BcHBsZVRWX0xpY2h0X2VpbnNjaGFsdGVuJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJXSVRIX0RFTEFZJTIyJTNFRkFMU0UlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGeG1sJTNF
->
%3Cxml%20xmlns%3D%22https%3A%2F%2Fdevelopers.google.com%2Fblockly%2Fxml%22%3E%3Cblock%20type%3D%22control%22%20id%3D%22A%5D_%3BZMV%5B1%2FR_X1YQ!W%5B_%22%20x%3D%2288%22%20y%3D%22262%22%3E%3Cmutation%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%20delay_input%3D%22false%22%3E%3C%2Fmutation%3E%3Cfield%20name%3D%22OID%22%3E0_userdata.0.Dummys.AppleTV_Licht_einschalten%3C%2Ffield%3E%3Cfield%20name%3D%22WITH_DELAY%22%3EFALSE%3C%2Ffield%3E%3C%2Fblock%3E%3C%2Fxml%3E
->
<xml xmlns="https://developers.google.com/blockly/xml"> <block type="control" id="A]_ ;ZMV[1/R_X1YQ!W[_" x="88" y="262"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.Dummys.AppleTV_Licht_einschalten</field> <field name="WITH_DELAY">FALSE</field> </block> </xml>
-
@ticaki Danke für die schnelle Antwort.
Base64 dekodieren ist je erst mal kein Problem. Den Step nach XML würde ich mir sparen. Dürfte für meinen Zweck nicht nötig sein, weil ich ja nur die Pfade abändern und dann wieder Base64 kodiert speichern will.
Mir ging es eher um die "merkwürdigen" id's. Aus deinem Beispiel wäre das z.B.
"A]_ ;ZMV[1/R_X1YQ!W[" aus dem Part: <block type="control" id="A] ;ZMV[1/R_X1YQ!W[_" x="88" y="262">.Da bin ich mir unsicher, ob das auch noch irgendwie kodiert ist oder ob es wirklich einfach eine ID ist, die ioB halt so verwendet.
-
Das sieht mir nach der Beschreibung und Position eines blockly bausteins aus, denke nicht dass das relevant ist.
Hab mal gerade ne id bei mir geändert (über den base64 weg und object) hab ne 2 dran gehangen
so sah es aus nach dem ich das Skript aufgerufen habe
und so nachdem ich ne kleinigkeit geändert habe
-
Der Umzug ist vollbracht.
Wenn auch nicht zu 100% automatisiert. Aber ich war mir zuerst gar nicht sicher, ob es überhaupt machbar ist.
Mein Vorgehen, vielleicht können sich ja mal die Profis zu äußern, ob das so halbwegs ok war.- Vollbackup vom kompletten System, Also iobroker_data, Redis und der SQL-Datenbank
- Ich hab mir in ioB ein Script geschrieben, dass mir alle Datenpunkte unter javascript.0.Datenpunkte ausliest und daraus zwei Textdateien erstellt. In der ersten wird für jeden Datenpunkt ein createState generiert, das den Datenpunkt mit allen Eigenschaften unter 0_userdata.0 anlegt.
Im zweiten File wird für jeden Datenpunkt ein setState / getState erzeugt, das mir dann später alle Values von den alten DPs auf die neuen kopiert. - Ich hab die script.json Datei aus dem Backup extrahiert und ein python Tool geschrieben (bzw. von der KI schreiben lassen), dass in dieser Datei erst mal alle "Datenpunktpfade" anpasst. Danach wird geprüft ob es sich jeweils um einen Blockly-Eintrag handelt und wenn ja, wird der letzte Kommentar extrahiert, Base64 dekodiert, URL dekodiert dann darin die Pfade angepasst, URL kodiert, Base64 kodiert und damit dann der alte Kommentar überschrieben. Das natürlich für alle enthaltenen Skripte. Waren bei mir immerhin rund 130 von den 170 enthaltenen Skripten.
Zu guter Letzt wurde die Datei gespeichert und wieder gepackt und ins Backupverzeichnis kopiert. - Ich hab mir den Inhalt der ersten Textdatei in ein javascript-Skript kopiert und ausgeführt. Damit waren schon mal alle Datenpunkte angelegt.
- Das gepatchte Backup wurde eingespielt.
- Dann hab ich mir den Inhalt der zweiten Textdatei in ein Skript kopiert und ausgeführt, damit die Datenpunkte alle aktuellen Werte hatten.
- Test der neuen Skripte
Dabei ist mir dann aufgefallen, dass ich alle Skripte einmal öffnen und neu speichern muss, damit sie sauber laufen. Das war zwar lästig, aber auch in 10 oder 15 Minuten passiert. - Ich hab den javascript Adapter vollständig gelöscht und neu installiert. Im Grunde war das der Auslöser meiner ganzen Aktion, weil der die Skripte nach einem Neustart nicht mehr automatisch gestartet hat. Kam immer ne Fehlermeldung er können eine View nicht finden.
- ioB neu starten, damit die entsprechend konfigurierten neuen Datenpunkte auch wieder sauber in die Datenbank geloggt werden und das System die neue Umgebung kennt.
- Abschließender Test ob die programmierten Automationen wieder funktionieren.
- Was ich völlig vergessen hatte war die Anpassung der VIS und der Charts. Das hat dann noch mal gute drei Stunden gedauert, damit auch dort alle Datenpunkte die neuen Pfade hatten. Das hab ich allerdings von Hand gemacht und das war echte Strafarbeit :-).
Auf jeden Fall scheint jetzt wieder alles zu laufen und ich hab endlich wieder ein halbwegs aufgeräumtes System vor der Brust.
Ich nutze in meinem System keine Alias und hatte daher damit auch keinen Aufwand. Allerdings würde man die dann auch anpassen müssen, sollte man sie nutzen. -
Punkt 2 da hättest du den Datenbaum exportier können, im erhaltenen JSON die Datenpunkt ändern und wieder importieren können
Sonst sie sehe ich kein vernesserungspotenzial