nachdem mein script immer größer wird, möchte ich das gelernte und ausprobierte mit euch teilen. Das Script ersetzt die Eigenverwaltung des roboters und läst damit wesentlich variablere Konfiguration zu.
! //Rasenmäher Script ! var landroidIP = "IP-des-Roboters"; var homemail = "mailadresse@Mail-adapters"; var targetmail = "mytarget@mail"; var weeklyruntime = 1000; //Minutes of cutting grass e.g. 800m² require 1000 Minutes var pfad = "Mower" + "."; var mailout = false; var rainwaitcounter = 0; var rain_true = false; //wait two minutes bevor going into rains state. (helps against moistured bushes in the morning) var out_of_order = 0; ! var forceCreation = false; var datenpunkte = { 'State': {"init":0, "common": {name: 'Mow_State'}}, 'Charger_State': {"init":0, "common": {name: 'Mow_CHGstate'}}, 'Battery_State': {"init":0, "common": {name: 'Mow_Battery'}}, 'RainSensor': {"init":0, "common": {name: 'Mow_Rain'}}, 'Worktimethisweek': {"init":0, "common": {name: 'Mow_this_week'}}, 'Workpercent': {"init":0, "common": {name: 'Mow_this_week_percent'}}, 'Start_mower': {"init":false, "common": {name: 'Mower_Start'}}, 'Stop_mower': {"init":false, "common": {name: 'Mower_Stop'}}, 'Monday_start': {"init":false, "common": {name: 'Monday_start'}}, 'Monday_ende': {"init":false, "common": {name: 'Monday_ende'}}, 'Tuesday_start': {"init":false, "common": {name: 'Tuesday_start'}}, 'Tuesday_ende': {"init":false, "common": {name: 'Tuesday_ende'}}, 'Wednesday_start': {"init":false, "common": {name: 'Wednesday_start'}}, 'Wednesday_ende': {"init":false, "common": {name: 'Wednesday_ende'}}, 'Thursday_start': {"init":false, "common": {name: 'Thursday_start'}}, 'Thursday_ende': {"init":false, "common": {name: 'Thursday_ende'}}, 'Friday_start': {"init":false, "common": {name: 'Friday_start'}}, 'Friday_ende': {"init":false, "common": {name: 'Friday_ende'}}, 'Saturday_start': {"init":false, "common": {name: 'Saturday_start'}}, 'Saturday_ende': {"init":false, "common": {name: 'Saturday_ende'}}, 'Sunday_start': {"init":false, "common": {name: 'Sunday_start'}}, 'Sunday_ende': {"init":false, "common": {name: 'Sunday_ende'}}, 'Lunch_break': {"init":false, "common": {name: 'Lunch_break'}}, 'Mow_on_holidays': {"init":false, "common": {name: 'Mow_on_holidays'}}, 'Daily_Cut': {"init":"true", "common": {name: 'Daily_Cut'}}, // three states: false, true, done ! }; function createDp() { var name; var init; var common; for (var dp in datenpunkte) { name = pfad + dp; init = datenpunkte[dp].init; common = datenpunkte[dp].common; createState(name, init , forceCreation, common); } } //{"tpl":"tplBasicState","data":{"oid":"javascript.0.Mower:Start_Mower","visibility-cond":"==","visibility-val":1,"value":"true","html":"[aktualisieren]","name":"Javascript ausführen","class":"","icon_src":"","gestures-offsetX":0,"gestures-offsetY":0,"gestures-swiping-value":"","gestures-rotating-value":"","gestures-pinching-value":"","gestures-swipeRight-value":"","gestures-swipeLeft-value":"","gestures-swipeUp-value":"","gestures-swipeDown-value":"","gestures-rotateLeft-value":"","gestures-rotateRight-value":"","gestures-pinchIn-value":"","gestures-pinchOut-value":""},"style":{"left":"318px","top":"28px","z-index":"40","color":"","font-family":"","font-style":"","font-size":"12px","width":"auto","height":"auto"},"widgetSet":"basic"}] on('javascript.0.Mower.Start_mower', function (obj) { if (!obj.state.ack && obj.state.val) { exec('curl -s --user admin:0000 -L ' + landroidIP + '/jsondata.cgi -H \"Authorization: Basic YWRtaW46MDAwMA== \" --data \"data=\"%\"5B\"%\"5B\"%\"22settaggi\"%\"22\"%\"2C11\"%\"2C1\"%\"5D\"%\"5D\" --compressed', function(err, stdout, stderr) { if (err) { log(err); return; } }); setState("javascript.0.Mower.Start_mower",false); } }); ! //{"tpl":"tplBasicState","data":{"oid":"javascript.0.Mower:Stop_Mower","visibility-cond":"==","visibility-val":1,"value":"true","html":"[aktualisieren]","name":"Javascript ausführen","class":"","icon_src":"","gestures-offsetX":0,"gestures-offsetY":0,"gestures-swiping-value":"","gestures-rotating-value":"","gestures-pinching-value":"","gestures-swipeRight-value":"","gestures-swipeLeft-value":"","gestures-swipeUp-value":"","gestures-swipeDown-value":"","gestures-rotateLeft-value":"","gestures-rotateRight-value":"","gestures-pinchIn-value":"","gestures-pinchOut-value":""},"style":{"left":"318px","top":"28px","z-index":"40","color":"","font-family":"","font-style":"","font-size":"12px","width":"auto","height":"auto"},"widgetSet":"basic"}] on('javascript.0.Mower.Stop_mower', function (obj) { if (!obj.state.ack && obj.state.val) { exec('curl -s --user admin:0000 -L ' + landroidIP + '/jsondata.cgi -H \"Authorization: Basic YWRtaW46MDAwMA== \" --data \"data=\"%\"5B\"%\"5B\"%\"22settaggi\"%\"22\"%\"2C12\"%\"2C1\"%\"5D\"%\"5D\" --compressed', function(err, stdout, stderr) { if (err) { log(err); return; } }); setState("javascript.0.Mower.Stop_mower",false); } }); ! function mow_week_reset() { //reset the state every week setState(pfad + "Worktimethisweek",0); setState(pfad + "Workpercent",0); } ! function mow_day_reset() { //reset the state every week if (getState('javascript.0.Mower.Daily_Cut').val == "false" || getState('javascript.0.Mower.Daily_Cut').val == "true") { } else if (getState('javascript.0.Mower.Daily_Cut').val == "done") { setState(pfad + "Daily_Cut","true"); } } ! function mow_auto() { exec('curl -s --user admin:0000 -L ' + landroidIP + '/jsonDebug.cgi', function(err, stdout, stderr) { if (err) { out_of_order +1; setState(pfad + "State","Disconnected " + out_of_order); if (out_of_order == 10) { if (mailout === false){ sendTo("email", { from: homemail, to: targetmail, subject: "Mower OFF", text: "Your Mower is not reachable of offline" }); mailout = true; } log(out_of_order); } return; } out_of_order = 0; str = stdout; str = stdout.substring(stdout.indexOf("{\"landroid\":{\"state\":") + 22); str = str.substring(0, str.indexOf(",") -1); setState(pfad + "State",str); str = stdout.substring(stdout.indexOf("\"batteryCharger\":{\"state\":") + 27); str = str.substring(0, str.indexOf(",") -1); setState(pfad + "Charger_State",str); str = stdout.substring(stdout.indexOf("rainSensor") + 12); str = str.substring(0, str.indexOf(",")); if (str < 3000) { str = "Rain detected"} else if (rainwaitcounter !== 0) {str = "Rainwait " + rainwaitcounter + " min"} else {str = "Not raining"; rain_true = false} setState(pfad + "RainSensor",str); str = stdout.substring(stdout.indexOf("\"battery\":{\"percentage\":") + 24); str = str.substring(0, str.indexOf(",")); setState(pfad + "Battery_State",str); }); var now = currentTime(); var start = "javascript.0.Mower." + day_of_week() + "_start"; var end = "javascript.0.Mower." + day_of_week() + "_ende"; var mowerstate = getState('javascript.0.Mower.State').val; if (mowerstate != "home") { var marker = 0; marker = getState('javascript.0.Mower.Worktimethisweek').val; if (mowerstate == "grass cutting") { setState(pfad + "Worktimethisweek",marker + 1); mailout = false; var percent = marker*100/weeklyruntime; setState(pfad + "Workpercent",marker*100/weeklyruntime); } if (mowerstate == "idle") { if (mailout === false){ sendTo("email", { from: homemail, to: targetmail, subject: "Mower IDLE", text: "Your Mower is in IDLE State" }); mailout = true; } } if (getState('javascript.0.Mower.RainSensor').val == "Rain detected") { ! if (rain_true === false) { rain_true = true; } else { exec('curl -s --user admin:0000 -L ' + landroidIP + '/jsondata.cgi -H \"Authorization: Basic YWRtaW46MDAwMA== \" --data \"data=\"%\"5B\"%\"5B\"%\"22settaggi\"%\"22\"%\"2C12\"%\"2C1\"%\"5D\"%\"5D\" --compressed', function(err, stdout, stderr) { if (err) { log(err); return; } });} rainwaitcounter = 30; log("Raining - Going home"); } } if (mowerstate == "home" && getState('javascript.0.Mower.Charger_State').val == "idle" && rainwaitcounter === 0) { if (getState('javascript.0.Mower.Worktimethisweek').val <= weeklyruntime || getState('javascript.0.Mower.Daily_Cut').val == "true") { if(now > getState(start).val && now < getState(end).val) { //log ("IN"); exec('curl -s --user admin:0000 -L ' + landroidIP + '/jsondata.cgi -H \"Authorization: Basic YWRtaW46MDAwMA== \" --data \"data=\"%\"5B\"%\"5B\"%\"22settaggi\"%\"22\"%\"2C11\"%\"2C1\"%\"5D\"%\"5D\" --compressed', function(err, stdout, stderr) { if (err) { log(err); return; } }); log("Mowing started"); setState(pfad + "Daily_Cut","done"); } //log(getState(start).val + getState(end).val + currentTime().toString()); } } if (rainwaitcounter > 0) { rainwaitcounter = rainwaitcounter -1; } ! } ! function currentTime() { var currentdate = new Date(); var cmin; if (currentdate.getMinutes() < 10) { cmin = "0" + currentdate.getMinutes().toString(); } else { cmin = currentdate.getMinutes(); } var chour; if (currentdate.getHours() < 10) { chour = "0" + currentdate.getHours().toString(); } else { chour = currentdate.getHours(); } return chour + ":" + cmin; } ! function day_of_week() { var d = new Date(); var weekday = new Array(7); weekday[0]= "Sunday"; weekday[1] = "Monday"; weekday[2] = "Tuesday"; weekday[3] = "Wednesday"; weekday[4] = "Thursday"; weekday[5] = "Friday"; weekday[6] = "Saturday"; var n = weekday[d.getDay()]; return n; } ! // regelmässige Wiederholungen // ----------------------------------------------------------------------------- schedule("* * * * *", mow_auto); schedule("59 23 * * 6", mow_week_reset); schedule("59 23 * * *", mow_day_reset); ! // main // ----------------------------------------------------------------------------- function main() { mow_auto(); } ! // Start Skript: // ----------------------------------------------------------------------------- ! createDp(); setTimeout(main, 5000); !