NEWS
Redis und "iobroker backup"
-
Bei der Verwendung von redis werden durch "iobroker backup" nicht die Zustände der Objekte abgespeichert. Wer - so wie ich - nun aber viele Objekte unter der javascript-Instanz hat, um z.B. Einstellungen für Rollladen oder Heizung abzulegen, braucht ein Backup für diese Werte.
Da ich keine Lust hatte, mich mit den Backup-Möglichkeiten von redis auseinanderzusetzen, habe ich mir 3 Scripte geschrieben, die ich hiermit als Vorlage hinterlege:
-
backupInstance (instanceName) - legt in destDirectory eine Datei mit allen Objektwerten dieser Instanz ab
-
availableFiles() - Ausgabe aller verfügbaren Dateien in destDirectory
-
restore (fileName) - Schreibt die Werte wieder zurück
Einschränkung:
-
derzeit nur "number", "boolean" und "string" unterstützt. Bei allen anderen Typen wird versucht den Wert als string abzulegen
-
um die Werte voneinander abzugrenzen wird ein "##" zwischen den Werten eingefügt. Wenn das jemand als normalen Wert in einem String hat, wird es zu Problemen kommen
! ```
// 20170826 - Fehlerausgabe verbessert // 20170826 - Fehler Sonderzeichen behoben ! var destDirectory = "/opt/iobroker/backups/"; ! backupInstance("javascript.0"); // availableFiles(); // restore("2017_08_26-11_42_46_backupjavascript.0Objects.txt"); ! // // backup instance // function backupInstance(instanceName) { var now = new Date(); var fileName = destDirectory + _date2String(now) + "-" + _time2String(now) + "_backup" + instanceName + "Objects" +".txt"; exec("touch " + fileName,function (error, stdout, stderr) { if (error) log("touch :" + stderr,"error"); else { var counter = 0; var objects = $('[id=' + instanceName + '.*]'); objects.each(function (id, i) { if( id.indexOf("scriptEnabled")<0 && id.indexOf("=null")<0 && id.indexOf("system.adapter.")<0 && id.indexOf("Servicemeldungen")<0 ) { var value = getState(id).val; var text = id + "=" + value; counter++; text = counter + "-" + text + "##"; exec("echo \"" + text + "\" >> " + fileName,function (error, stdout, stderr) {if (error) log("echo : " + text + " (" + stderr + ")","error");}); } }); log("done - " + counter); } }); } ! // // restore data from fileName // function restore (fileName) { exec("cat " + destDirectory + fileName, function (error, stdout, stderr) { if (error) log(stderr,"error"); else { var counter = 0; var objects = stdout.split("##"); log(objects.length-1 + " objects found"); for (var i=0; i <objects.length-1;i++) {/var/text="objects[i];" id="text.substring(text.indexOf("-")+1,text.indexOf("="));" object="getObject(id);" if(object)/counter/++;/value="text.substring(text.indexOf("=")+1);" type="object.common.type;" switch/(type)/case/"number":/valn="Number(value);" log("number/"/+/valn);/setstate(id,valn);/break;/"boolean":/valb="(value" =="true" );/log("boolean/valb);/setstate(id,valb);/"string":/log/("string/value);/setstate(id,value);/default:/log("unsupported/type:/type,"warn");/}/else/log("object/does/not/exist:/id,"warn");/log("done/-/counter);/});/write/available/file/names/to/function/availablefiles()/exec("ls/destdirectory/"*.txt",/(error,/stdout,/stderr)/files="stdout.split(destDirectory);" log(files.length);/for/(var/i="0;i<files.length;i++)" (files[i]);/lib/_time2string(time)/hours="time.getHours();" minutes="time.getMinutes();" seconds="time.getSeconds();" retval="hours">9 ? hours : "0"+hours; retval += "_"; retval += minutes > 9 ? minutes : "0"+minutes; retval += "_"; retval += seconds > 9 ? seconds : "0"+seconds; return (retval); } ! function _date2String(date) { var day = date.getDate(); var month = date.getMonth() + 1; var year = date.getFullYear(); var retval = year; retval += "_"; retval += month > 9 ? month : "0"+month; retval += "_"; retval += day > 9 ? day : "0"+day; return (retval); }</objects.length-1;i++)>
[/i][/i] -