Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Please move the states to 0_userdata.0.*

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.8k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.2k

Please move the states to 0_userdata.0.*

Scheduled Pinned Locked Moved JavaScript
56 Posts 14 Posters 6.3k Views 16 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • DJMarc75D DJMarc75

    @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.

    R Offline
    R Offline
    RaBu60
    wrote on last edited by RaBu60
    #46

    @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 :blush:

    DJMarc75D 1 Reply Last reply
    0
    • R RaBu60

      @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 :blush:

      DJMarc75D Offline
      DJMarc75D Offline
      DJMarc75
      wrote on last edited by
      #47

      @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.

      Lehrling seit 1975 !!!
      Beitrag geholfen ? dann gerne ein upvote rechts unten im Beitrag klicken ;)
      https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge

      R 1 Reply Last reply
      0
      • DJMarc75D DJMarc75

        @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.

        R Offline
        R Offline
        RaBu60
        wrote on last edited by
        #48

        @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);
        });
        
        
        1 Reply Last reply
        0
        • R RaBu60

          @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?

          T Do not disturb
          T Do not disturb
          ticaki
          wrote on last edited by ticaki
          #49

          @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.

          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

          Spenden

          R O 2 Replies Last reply
          0
          • T ticaki

            @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.

            R Offline
            R Offline
            RaBu60
            wrote on last edited by
            #50

            @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 :+1:
            Vielen Dank für die Unterstützung:clap:

            1 Reply Last reply
            0
            • T ticaki

              @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.

              O Offline
              O Offline
              Olivbus
              wrote on last edited by Olivbus
              #51

              @ticaki "startScript('scriptName', ignoreIfStarted, callback)" gibt es für diesen Befehl auch ein blockly Baustein?

              T 1 Reply Last reply
              0
              • O Olivbus

                @ticaki "startScript('scriptName', ignoreIfStarted, callback)" gibt es für diesen Befehl auch ein blockly Baustein?

                T Do not disturb
                T Do not disturb
                ticaki
                wrote on last edited by ticaki
                #52

                @olivbus sagte in Please move the states to 0_userdata.0.*:

                @ticaki "startScript('scriptName', ignoreIfStarted, callback)" gibt es für diesen Befehl auch ein blockly Baustein?

                soweit ich das sehe nein, aber kannst du dir ja selbst bauen.
                Schreibe in eine Variable (die umbenannt wurde in z.B. variablename) den Scriptnamen z.B. Test.Skript_1
                Dann nimm aus Funktionen das 4. von oben gibst ihr einen brauchbaren Namen und kicke auf die 3 Punkte dort gibts du dann:

                startScript(variablename)
                

                jetzt müsste in Funktionen ab der 6. von oben deine Funktion auftauchen, die du wie einen Blocklybaustein verwenden kannst. Must halt vorher den zu verwendeten Wert in die Variable schreiben.

                wie du bestimmt gesehen hast, muss der name im Skript dem Namen der Variable entsprechen

                Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                Spenden

                O 1 Reply Last reply
                0
                • T ticaki

                  @olivbus sagte in Please move the states to 0_userdata.0.*:

                  @ticaki "startScript('scriptName', ignoreIfStarted, callback)" gibt es für diesen Befehl auch ein blockly Baustein?

                  soweit ich das sehe nein, aber kannst du dir ja selbst bauen.
                  Schreibe in eine Variable (die umbenannt wurde in z.B. variablename) den Scriptnamen z.B. Test.Skript_1
                  Dann nimm aus Funktionen das 4. von oben gibst ihr einen brauchbaren Namen und kicke auf die 3 Punkte dort gibts du dann:

                  startScript(variablename)
                  

                  jetzt müsste in Funktionen ab der 6. von oben deine Funktion auftauchen, die du wie einen Blocklybaustein verwenden kannst. Must halt vorher den zu verwendeten Wert in die Variable schreiben.

                  wie du bestimmt gesehen hast, muss der name im Skript dem Namen der Variable entsprechen

                  O Offline
                  O Offline
                  Olivbus
                  wrote on last edited by Olivbus
                  #53

                  @ticaki vielen Dank für die super schnelle Antwort.
                  Habe es ausprobiert. Es geht auch ohne Anlage einer Variable. Einfach in dem Baustein:
                  4e749faf-c434-45c7-adb7-57ca4901281d-image.png
                  die drei Punkte anklicken und den Befehl:

                  startScript('Name des Scripts')
                  

                  eingeben. (Die Anführungszeichen nicht vergessen.)

                  T 1 Reply Last reply
                  0
                  • O Olivbus

                    @ticaki vielen Dank für die super schnelle Antwort.
                    Habe es ausprobiert. Es geht auch ohne Anlage einer Variable. Einfach in dem Baustein:
                    4e749faf-c434-45c7-adb7-57ca4901281d-image.png
                    die drei Punkte anklicken und den Befehl:

                    startScript('Name des Scripts')
                    

                    eingeben. (Die Anführungszeichen nicht vergessen.)

                    T Do not disturb
                    T Do not disturb
                    ticaki
                    wrote on last edited by
                    #54

                    @olivbus
                    Jo, dann siehst du halt von außen nicht welchen Skript und das ich nicht so Blockly like :)

                    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                    Spenden

                    1 Reply Last reply
                    0
                    • R RaBu60

                      Ich habe auch dieses Problem :slightly_frowning_face:

                      Hier die Struktur unter Javascript:
                      Screenshot 2023-06-24 141914.png

                      Wenn ich nun folgendes JS starte (ist wirklich nur ein Einzeiler)

                      setState("javascript.0.scriptEnabled.Hydrawise.Hydrawise", false, true);
                      

                      erhalte ich
                      Screenshot 2023-06-24 142210 a.png

                      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

                      apollon77A Offline
                      apollon77A Offline
                      apollon77
                      wrote on last edited by
                      #55

                      @rabu60 Ok, wenn die meldung wirklich durch ein setState kommt dann bitte ein GitHub issue öffnen. Dann muss man offizielle Skriptnamen ausschliessen ...

                      Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                      • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                      • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                      A 1 Reply Last reply
                      0
                      • apollon77A apollon77

                        @rabu60 Ok, wenn die meldung wirklich durch ein setState kommt dann bitte ein GitHub issue öffnen. Dann muss man offizielle Skriptnamen ausschliessen ...

                        A Offline
                        A Offline
                        Aiouh
                        wrote on last edited by Aiouh
                        #56

                        @apollon77 @RaBu60 ich denke das ist dasselbe verhalten über das ich gerade gestolpert bin.
                        Hoffe mein issue dazu passt soweit https://github.com/google/blockly/issues/7232

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        406

                        Online

                        32.4k

                        Users

                        81.5k

                        Topics

                        1.3m

                        Posts
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                        ioBroker Community 2014-2025
                        logo
                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Home
                        • Recent
                        • Tags
                        • Unread 0
                        • Categories
                        • Unreplied
                        • Popular
                        • GitHub
                        • Docu
                        • Hilfe