@haus-automatisierung
Danke, das war's. (Obwohl mir die 4er Oberfläche besser gefällt )
NEWS
Best posts made by RaBu60
-
RE: Test Adapter TrashSchedule
Latest posts made by RaBu60
-
RE: Test Adapter OpenLigaDB
Hi,
auch ich habe das Problem. Ich habe auch schon ein issue auf Github eröffnet.
Da habe ich auch geschrieben, dass ich die Adressen, die im Log angezeigt werden im Browser eingegeben habe.
Dort erhalte ich auch den Fehler. Keine Ahnung, ob das aussagekräftig ist, aber ich denke eher, dass die URL nicht mehr stimmt.Letzter Fehler im Log war 2023-07-04 09:56:19.051.
-
RE: Datenpunkt vom Typ Array States löschen
Danke für den Hinweis. Ich verzichte auf extendObject() komplett.
let sObjID = '0_userdata.0.NeuerZustand'; let obj=getObject(sObjID); obj.common["states"]={}; var i_list = Array.prototype.slice.apply($("state[state.id=0_userdata.0.Zones.Zone_*.relay]")); for (var i_index in i_list) { i = i_list[i_index]; sBasePoint = i.slice(0, i.lastIndexOf('.') + 1); obj.common.states[parseInt(getState((String(sBasePoint) + 'relay')).val)] = getState((String(sBasePoint) + 'name')).val; }; setObject(sObjID, obj);
So funktioniert es (Hoffentlich)
-
RE: Datenpunkt vom Typ Array States löschen
@paul53
Man muss nur hartnäckig sein...Ich habe einen Weg gefunden:
let sObjID = '0_userdata.0.NeuerZustand'; let obj=getObject(sObjID); delete obj.common.states; setObject(sObjID, obj); extendObject(sObjID, {common: { "states": { 1: "Rasen und Hang", 2: "Rasen und Hochbeet", 5: "Dach", 4: "Vorgarten" } }});
Vielen Dank für Deine Hilfe und Inspiration. Manchmal braucht man nur einen Denkanstoß
-
RE: Datenpunkt vom Typ Array States löschen
@paul53 sagte :
Wie variabel? Genügt es nicht, common.min (1), common.max (4) und common.step (1) zu setzen? Dann können zumindest Skript keine Werte außerhalb des Bereiches schreiben.
Nein, leider nicht.
-
RE: Datenpunkt vom Typ Array States löschen
@paul53 sagte in Datenpunkt vom Typ Array States löschen:
@rabu60 sagte: löschen ohne gleich den ganzen Datenpunkt neu anlegen zu müssen?
Du möchtest das Objekt common.states löschen? Man kann es leeren:
extendObject('0_userdata.0.NeuerZustand', {common: {states: {}}})
Ich habe jetzt den Datenpunkt mit Typ "number" neu angelegt und die States geschrieben.
Der Vorschlag es zu leeren hat leider auch nicht funktioniert.Eigentlich sind die Objekte statisch, d.h. sie sollten konstant bleiben. Variable Werte schreibt man mit setState() in den Datenpunktwert. Was möchtest Du erreichen?
Nun, ich möchte, dass in diesem Datenpunkt nur bestimmte Werte gespeichert werden können. Leider ist diese Werteliste unter bestimmten Bedingungen variabel und nicht immer (wie in meinem Beispiel) Werte zwischen 1 und <n>
-
Datenpunkt vom Typ Array States löschen
Hallo,
ich sitze hier schon seit Tagen vor einem Problem mit einem Datenpunkt vom Typ Array.
Alles Probieren, Doku lesen, Googeln und Forumsuche (vielleicht habe ich auch die falschen Stichworte verwendet) hat mich nicht weiter gebrachtIch habe einen Datenpunk unter "0_userdata.0.NeuerZustand" mit folgender Definition angelegt:
"common": { "name": "NeuerZustand", "desc": "Manuell erzeugt", "role": "state", "type": "array", "read": true, "write": true, "states": { "1": "Erdgeschoss", "2": "Obergeschoss", "3": "Beete", "4": "Halle" } }
Mit
extendObject('0_userdata.0.NeuerZustand', {common: { "states": { "1": "Erdgeschoss", "2": "Obergeschoss", "3": "Dach", "4": "Halle" }}})
kann ich den Text der einzelnen Elemente im Array (im Beispiel oben Beete --> Dach) ändern bzw. neue Elemente einfügen.
Wie kann ich in dem Array einzelne Elemente löschen bzw. das ganze Array löschen ohne gleich den ganzen Datenpunkt neu anlegen zu müssen?
-
RE: Please move the states to 0_userdata.0.*
@ticaki sagte in Please move the states to 0_userdata.0.*:
@rabu60 sagte in Please move the states to 0_userdata.0.*:
@thomas-braun sagte in Please move the states to 0_userdata.0.*:
@rabu60 sagte in Please move the states to 0_userdata.0.*:
Aber es sollte doch möglich sein, diesen Datenpunkt per Script zu ändern
Wenn es im dafür vorgesehenen Verzeichnis passiert erscheint auch keine Meldung.
Nun, ich möchte per Script ein anderes Script (in diesem Falle "Hydrawise") stoppen
und ggfs. wieder starten.startScript('scriptName', ignoreIfStarted, callback); Beispiel: Skript im Ordner Test, Name: Skript 1 startScript('Test.Skript_1') stopScript('scriptName', callback);
Dafür gibt es Befehle.
Wow, das war's
Vielen Dank für die Unterstützung -
RE: Please move the states to 0_userdata.0.*
@djmarc75 sagte in Please move the states to 0_userdata.0.*:
@rabu60 sagte in Please move the states to 0_userdata.0.*:
Ich hoffe ich konnte das etwas verständlich rüberbringen
für mich nicht... und ist das Skript geheim ? Wir sind hier keine Hellseher.
Natürlich ist das Script nicht geheim...
Hier der Code, der die regelmäßige Abfrage macht (Scripname Hydrawise):
var source_dp = '0_userdata.0.Hydrawise'; var dpSettings = source_dp+".Settings"; var dpAPI_Key = dpSettings+".API_Key"; var dpInterval = dpSettings+".interval"; var debugNoLog = 'nolog'; var debugInfo = 'info'; var debugWarn = 'warn'; var debugError = 'error'; var debugMode = debugNoLog; var iIntervall = function(){ let iTime; iTime=getState(dpInterval).val; if ((iTime == 0)||(iTime == 1)){ return '* * * * *'; } else { return '*/'+iTime.toString()+' * * * *'; } }; // @ts-ignore let oSchedule = schedule(iIntervall(), function(){ let vAPI_key = getState(dpAPI_Key).val; if (debugMode != debugNoLog){ console.log('Anfrage an Hydrawise gestartet'); }; //Customer und Controller Infos holen var url='https://app.hydrawise.com/api/v1/customerdetails.php?api_key='+vAPI_key request({url : url}, function (error, response, body) { let data; if (body.toLowerCase() === 'api key not valid') { console.error(body); } else { try { data=JSON.parse(body); GetCustomerAndController(data); } catch(e) { switch(debugMode) { case debugWarn: console.warn('Hydrawise Customer und Controller:'+body); break; case debugError: console.error('Hydrawise Customer und Controller:'+body); break; case debugInfo: console.log('Hydrawise Customer und Controller:'+body); //debugMessage); default: } } } }); //Zonen und Sensoren Infos holen var url='https://app.hydrawise.com/api/v1/statusschedule.php?api_key='+vAPI_key request({url : url}, function (error, response, body) { let data; if (body.toLowerCase() === 'api key not valid') { console.error(body); } else { try { data=JSON.parse(body); GetRelaysAndSensors(data); } catch(e) { switch(debugMode) { case debugWarn: console.warn('Hydrawise Zonen und Sensoren: '+body); break; case debugError: console.error('Hydrawise Zonen und Sensoren: '+body); break; case debugInfo: console.log('Hydrawise Zonen und Sensoren:'+body); default: } } } }); if (debugMode != debugNoLog){ console.log('Hydrawise Abfrage beendet'); }; }) /** * @param {string} DataPoint * @param {string} DP_Desc */ function SetDatapoint (DataPoint, DP_Desc, DP_value){ if (existsState(DataPoint)==false){ createState(DataPoint, { name: DP_Desc, desc: DP_Desc, type: typeof DP_value, role: 'state' }); }; setState(DataPoint, DP_value, true ); } function GetCustomerAndController(data){ var UserInfos = source_dp + '.UserInfo'; var Controller = source_dp + '.Controller'; SetDatapoint (UserInfos + '.customer_id', 'Customer ID', data.customer_id); SetDatapoint (Controller + '.name', 'Name of controller', data.controllers[0].name); SetDatapoint (Controller + '.last_contact', 'Last time we contacted controller (Timestamp)', data.controllers[0].last_contact); SetDatapoint (Controller + '.lastContact', 'Last time we contacted controller', getTimeFormat(data.controllers[0].last_contact*1000)); SetDatapoint (Controller + '.serial_number', 'Serial number of controller', data.controllers[0].serial_number); SetDatapoint (Controller + '.controller_id', 'Unique ID of controller', data.controllers[0].controller_id); }; function GetRelaysAndSensors(data){ if ('undefined' !== typeof data.relays){ var Zones = source_dp + '.Zones.Zone_'; var Sensor = source_dp + '.Sensors.Sensor_'; let tsnow=(Date.now()); //Alle Zoneninfos aus JSON lesen for (var i = 0; i < data.relays.length; i++) { SetDatapoint (Zones + data.relays[i].relay + '.relay_id', 'ID of the zone',data.relays[i].relay_id); SetDatapoint (Zones + data.relays[i].relay + '.time', 'Number of seconds until the next programmed run',data.relays[i].time); SetDatapoint (Zones + data.relays[i].relay + '.next_runtime', 'Next time this zone will run',getTimeFormat(tsnow+data.relays[i].time*1000)); SetDatapoint (Zones + data.relays[i].relay + '.run', 'Length of next run time',data.relays[i].run); SetDatapoint (Zones + data.relays[i].relay + '.run_min', 'Length of next run time in minutes',Math.round(data.relays[i].run/60)); if (getState(Zones + data.relays[i].relay + '.name').val.slice(0, data.relays[i].name.length) != data.relays[i].name) { SetDatapoint (Zones + data.relays[i].relay + '.name', 'Zone name',data.relays[i].name); }; SetDatapoint (Zones + data.relays[i].relay + '.relay', 'Zone number',data.relays[i].relay); SetDatapoint (Zones + data.relays[i].relay + '.type', 'Zone type',data.relays[i].type); SetDatapoint (Zones + data.relays[i].relay + '.period', 'Period',data.relays[i].period); SetDatapoint (Zones + data.relays[i].relay + '.timestr', 'Next time this zone will water in a friendly string format',data.relays[i].timestr); SetDatapoint (Zones + data.relays[i].relay + '.stop', 'Stop',data.relays[i].stop); SetDatapoint (Zones + data.relays[i].relay + '.sensor_0', 'Depending on sensor port 1',false); SetDatapoint (Zones + data.relays[i].relay + '.sensor_1', 'Depending on sensor port 2',false); //Sensoren für diese Zone? if ('undefined' !== typeof data.sensors){ for (var s = 0; s < data.sensors.length; s++) { setState(Zones + data.relays[i].relay + '.sensor_' + s, false, true ); if ('undefined' !== typeof data.sensors[s].relays){ for (var j = 0; j < data.sensors[s].relays.length; j++) { if (data.sensors[s].relays[j].id == data.relays[i].relay_id){ setState(Zones + data.relays[i].relay + '.sensor_' + s, true, true ); } } } } } } //Alle Sensoreninfos aus JSON lesen if ('undefined' !== typeof data.sensors){ for (var i = 0; i < data.sensors.length; i++) { SetDatapoint (Sensor + data.sensors[i].input + '.input', 'Input port',data.sensors[i].input); SetDatapoint (Sensor + data.sensors[i].input + '.type', 'Sensor type',data.sensors[i].type); switch (data.sensors[i].type) { case 1: SetDatapoint (Sensor + data.sensors[i].input + '.typ', 'Type of sensor','Rain sensor'); break; case 2: SetDatapoint (Sensor + data.sensors[i].input + '.typ', 'Type of sensor','Flow meter'); break; default: SetDatapoint (Sensor + data.sensors[i].input + '.typ', 'Type of sensor','Custom'); } SetDatapoint (Sensor + data.sensors[i].input + '.mode', 'Sensor mode',data.sensors[i].mode); SetDatapoint (Sensor + data.sensors[i].input + '.timer', 'Timer',data.sensors[i].timer); SetDatapoint (Sensor + data.sensors[i].input + '.offtimer', 'offtimer',data.sensors[i].offtimer); } } } else { console.warn('No response from Hydrawise') }; }; function getTimeFormat(data) { let date=new Date(data); return (("0"+date.getDate()).slice(-2)+ "-"+("0"+(date.getMonth()+1)).slice(-2)+ "-"+date.getFullYear()+ " "+("0"+date.getHours()).slice(-2)+ ":"+("0"+date.getMinutes()).slice(-2)+ ":"+("0"+date.getSeconds()).slice(-2)); }; // bei Scriptstop onStop (function scriptStop () { clearSchedule(oSchedule); }, 1000);
... und hier das Script welches "Hydrawise" stoppen und wieder starten soll:
var source_dp = '0_userdata.0.Hydrawise'; var sdpSettings=source_dp+'.Settings'; var dpScripts = 'javascript.0.scriptEnabled.Hydrawise'; on({id: [].concat(Array.prototype.slice.apply($("state[state.id="+sdpSettings+".*]"))), change: "ne"}, async function (obj) { setState(dpScripts + ".Hydrawise", false, true); setStateDelayed(dpScripts + ".Hydrawise", true, false, 5000, false); });
-
RE: Please move the states to 0_userdata.0.*
@djmarc75
Nun, ich habe das Script 1, welches über schedule regelmäßig Abfragen über den Status meiner Beregnungsanlage abfrägt.
Ich habe Datenpunkte unter 0_userdata.* angelegt, die die Settings (z.B. Request-URL,
Abfrageintervall etc.) beinhalten.
Wenn ich nun Settings ändere, und da ist z.B. das Abfrageintervall welches die schedule-Zeiten betreffen, möchte ich das Script nicht manuell stoppen und wieder starten müssen.
Das soll z.B. Script 2 , welches weitere DPs "überwacht" für mich erledigen.Ich hoffe ich konnte das etwas verständlich rüberbringen