NEWS
Please move the states to 0_userdata.0.*
-
{ "_id": "javascript.0.scriptEnabled.PV_hourly", "common": { "name": "scriptEnabled.PV_hourly", "desc": "controls script activity", "type": "boolean", "write": true, "read": true, "role": "switch.active" }, "native": { "script": "script.js.PV_hourly" }, "type": "state", "from": "system.adapter.javascript.0", "user": "system.user.admin", "ts": 1681754209752, "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } }
-
@dougstar nee, nicht die Objektdaten.
die Liste der Objekte.scriptEnabled gehört in javascript.0
-
@homoran sagte in Please move the states to 0_userdata.0.*:
@dougstar nee, nicht die Objektdaten.
die Liste der Objekte.scriptEnabled gehört in javascript.0
aber
javascript.0.scriptEnabled.PV_hourly
ist nicht das Skript mit ...telegram... aus deinem Screenshot -
Danke, ich habe den Fehler gefunden.
Es hat geholfen sich nochmal mit dem Thema zu befassen -
Hallo,
ich bekomme auch die Meldung:
script.js.Scripte.Akku_LG: Own states (javascript.0.scriptEnabled.Scripte.Akku-Ladesteuerung) should not be used in javascript.X.scriptEnabled.! Please move the states to 0_userdata.0.So sieht mein Objektbaum aus:
Jetzt die Anfängerfragen:
Wie bekomme ich den Status zu Userdata usw. Mir geht es nur darum das Script ein- bzw. auszuschalten.Schon mal Danke
Peschu21
-
@peschu Dann ist aber hier was komisch. Dein Skript Scripte.Akku_LG scheint einen State dort anlegen zu wollen ... das darf es nicht. Zeig doch mal das Skript
-
-
@peschu Das kanns aber jicht sein weil die meldung nur kommt wenn du states anlegst! (createState) ... keine ahnung was blockyly da tut
-
@peschu sagte in Please move the states to 0_userdata.0.*:
Da ist der Ausschnitt:
Ausschnitte helfen selten!
wie kommt der Datenpunkt in das Verzeichnis?
-
@apollon77 sagte in Please move the states to 0_userdata.0.*:
weil die meldung nur kommt wenn du states anlegst! (
sicher?
nicht auch wenn ein DP in dem Verzeichnis angesprochen wird?@peschu hat sich erledigt. Dein Skript heisst so?
-
@homoran
Jetzt stehe ich auf dem Schlauch. der Datenpunkt dürfte vom Script kommen, weil das so heißt und sich auch in dem entsprechenden Ordner befindet.Das ist das gesamte Script:
-
Ich habe auch dieses Problem
Hier die Struktur unter Javascript:
Wenn ich nun folgendes JS starte (ist wirklich nur ein Einzeiler)
setState("javascript.0.scriptEnabled.Hydrawise.Hydrawise", false, true);
erhalte ich
Den Datenpunkt unter javascript.0... habe ich nicht selbst angelegt.
Wie kann ich diesen Log-Eintrag unterdrücken?
Die Version des JS-Adapters ist 7.0.3 -
@rabu60 sagte in Please move the states to 0_userdata.0.*:
Wie kann ich diesen Log-Eintrag unterdrücken?
Du willst das nicht unterdrücken sondern die Ursache beseitigen. Kann sonst ggfs . in künftigen Versionen zu einem Fehler führen.
-
@thomas-braun sagte in Please move the states to 0_userdata.0.*:
Du willst das nicht unterdrücken sondern die Ursache beseitigen. Kann sonst ggfs . in künftigen Versionen zu einem Fehler führen.
Klar, unterdrücken wäre wirklich suboptimal
Aber es sollte doch möglich sein, diesen Datenpunkt per Script zu ändern ohne diesen Log-Eintrag zu erhalten
Mache ich irgendetwas falsch? -
@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.
-
@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.Welcher DP bzw. Verzeichnis wäre das Richtige?
-
@rabu60 sagte in Please move the states to 0_userdata.0.*:
Nun, ich möchte per Script ein anderes Script (in diesem Falle "Hydrawise") stoppen
und ggfs. wieder starten.Warum will man sowas machen ?
Hat wenig Sinn.
-
@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
-
@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.
-
@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); });