Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. IPCam FI9928P Position nach Astro http Request

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    IPCam FI9928P Position nach Astro http Request

    This topic has been deleted. Only users with topic management privileges can see it.
    • smartboart
      smartboart last edited by smartboart

      Threatumzug: im Growatt Threat driftetetn wir in Richtung Foscam ab. Deshalb hier ein Threat dazu. Hintergrund war eine Skriptanfrage dazu.

      • smartboart 02.12.19 V0.04 weiteres Loglevel implementiert und Logik Scriptstart überarbeitet - Tag / Nacht wird in den states gespeichert. bei erstmaliger Ausführung müssen die Zustände Tagesposition / Nachtposition stimmen. Spätestens beim nächsten Schedule( Astro Trigger ) stimmen die States dann automatisch. Sollte eigentlich reichen.

      • smartboart 02.12.19 V0.05 Unterteilung in Konfigurationsbereich / Variablen für Http Request hinzugefügt

      • smartboart 03.12.19 V0.06 8 Presets Hinzugefuegt und entsprechende states angelegt um diese ueber Vis anfahren zu koennen. Sowie eine Stoppfunktion eingebaut . Astro ueber ueber Vis aktivier / deaktivierbar force creation hinzugefügt und create state überarbeitet. automatische Kontrollfahrt / anfahren aller angelegten Presets hinzugefügt. aktivierbare und verweildauer einstellbar in vis

      • smartboart 04.12.19 V0.07 Const Bewegungsmelder und Klingel hinzugefügt, Funktion under construction.

      • smartboard 08.12.19 V0.08 Log Einträge ergänzt Und Fehler in Zeitberechnung Verweilzeit bei Kontrollfahrten beseitigt/ Vis Eingabe in Sekunden

      • smartboart 08.12.19 V0.09 Funktionen der Foscam hinzugefügt. wie z.B Preset Cruise Funktionen und manuelle Fahrbefehle , Geschwindigkeit und Cruisdauer usw.
        Achtung State Namen wurden geändert. ForceCreation ist aktiv. Gleichnamige States werden überschrieben neue angelegt. Am Besten alle States löschen und
        Skript 2 x starten.Anpassungen in Vis evtl erforderlich.
        Nicht alle States sind schon aktiv. diverse Funktionen noch nicht implementiert.
        Ich habe mich dazu entschlossen das Skript eher wie eine Art Adapter aufzubauen und diverse Komfortfunktionen zu integrieren, welche es in der Foscam
        Firmware nicht gibt. Ansosnten aber die Komforfunktionen der Kamera zu nutzen woes sinn macht. Deshalb die Überwahungsfahrt im Script entfernt und die der Kamera wird dann angesprochen.

      • smartboart 08.12.19 V0.10 Manuelle Fahrbefehle implementiert, Fahrgeschwindigkit einstellbar, sofortiger stop und Homeposition der Kameraanfahren implementiert

      • smartboart 08.12.19 V0.11 start cruise , stop cruise und set CruiseTime implementiert
        -smartboart 08.12.19 v0.12 Bugfix Logging und Stop Kamerabewegung
        -smartboart 11.12.19 V1.00 Bugfixes

      • noch offen Trigger Motion und Klingel verarbeiten und Informationen aus der Kamera auslesen und in states schreiben, diese dazu anlegen...

      Skript / Adapter Foscam FI9928P mittels CGI Befehle nach Doku siehe Link.

      https://www.foscam.es/descarga/Foscam-IPCamera-CGI-User-Guide-AllPlatforms-2015.11.06.pdf

      //Skript Kamerasteuerung  01.12.2019 V0.03
       
       /*
      #####changelog#####
      - smartboart 02.12.19 V0.04  weiteres Loglevel implementiert und Logik Scriptstart überarbeitet - Tag / Nacht wird in den states gespeichert. 
      bei erstmaliger Ausführung müssen die Zustände Tagesposition / Nachtposition stimmen. Spätestens beim nächsten Schedule( Astro Trigger ) 
      stimmen die States dann automatisch. Sollte eigentlich reichen. 
      - smartboart 02.12.19 V0.05 Unterteilung in Konfigurationsbereich / Variablen für Http Request hinzugefügt
      - smartboart 03.12.19 V0.06 8 Presets Hinzugefuegt und entsprechende states angelegt
       um diese ueber Vis anfahren zu koennen. Sowie eine Stopfunktion eingebaut . Astro ueber ueber Vis aktivier / deaktivierbar
       force creation hinzugefügt und create state überarbeitet. Automatische Kontrollfahrt / anfahren aller angelegten Presets hinzugefügt.Aktivierbar durch den entsprechenden state
      - smartboart 04.12.19 V0.07 Const Bewegungsmelder und Klingel hinzugefügt, Funktion under construction.
      - smartboart 08.12.19 V0.08 Log Einträge ergänzt
      - smartboart 08.12.19 V0.09 Funktionen der Foscam hinzugefügt. wie z.B Preset Cruise Funktionen und manuelle Fahrbefehle , Geschwindigkeit und Cruisdauer usw.
      Achtung State Namen wurden geändert. ForceCreation ist aktiv. Gleichnamige States werden überschrieben neue angelegt. Am Besten alle States löschen und
      Skript 2 x starten.Anpassungen in Vis evtl erforderlich.
      Nicht alle States sind schon aktiv. diverse Funktionen noch nicht implementiert.
      Ich habe mich dazu entschlossen das Skript eher wie eine Art Adapter aufzubauen und diverse Komfortfunktionen zu integrieren, welche es in der Foscam 
      Firmware nicht gibt. Ansosnten aber die Komforfunktionen der Kamera zu nutzen woes sinn macht. Deshalb die Überwahungsfahrt im Script entfernt und die der Kamera wird dann angesprochen.
      - smartboart 08.12.19 V0.10 Manuelle Fahrbefehle implementiert, Fahrgeschwindigkit einstellbar, sofortiger stop und Homeposition der Kameraanfahren implementiert
      - smartboart 08.12.19 V0.11 start cruise , stop cruise und set CruiseTime implementiert
      - smartboart 08.12.19 v0.12 Bugfix Logging und Stop Kamerabewegung
      - smartboart 11.12.19 V1.00 Bugfixes
      */
      
      //*******************************Konfigurationsteil*******************************
      // fc wenn aktiv ueberschreibt fc bereits angelegten States...wenn nachträgliche Änderung der States überschrieben weden sollen
      const fC = true;
      
      
      /* Anlegen der Constanten für die Logik für Vis Hier wird der Installationspfad festgelegt 
      Bei speichen unter javascript instanz 0 erfolgt dies unter jacascript.0.Kamera.Test.Kontrollfahrt*/
      const Statepfad = 'javascript.' + instance + '.Kamera.Test.';
      const idAnhaltezeit = Statepfad + 'Anhaltezeit';
      //const idKontrollfahrt =  Statepfad + 'Kontrollfahrt';
      //const idVerweilzeit = Statepfad + 'Verweilzeit';
      const idPosTag = Statepfad + 'Tagesposition';
      const idPosNacht = Statepfad + 'Nachtposition';
      const idAstro = Statepfad + 'Astro';
      
      const idReset = Statepfad + 'Reset';
      const idStopRun =     Statepfad + 'StopRun';
      const idZoomIn =    Statepfad + 'ZoomIn';
      const idZoomOut =   Statepfad + 'ZoomOut';
      const idZoomSpeed = Statepfad + 'ZoomSpeed';
      const idZoomStop = Statepfad + 'ZoomStop';
      const idGotoPreset =   Statepfad + 'GotoPreset';
      const idSpeed     = Statepfad + 'Speed';
      const idStopzeit = Statepfad + 'Stopzeit';
      const idMoveRight =    Statepfad + 'MoveRight';
      const idMoveLeft =     Statepfad + 'MoveLeft';
      const idMoveUp =      Statepfad + 'MoveUp';
      const idMoveTopRight = Statepfad + 'MoveTopRight';
      const idMoveTopLeft = Statepfad + 'MoveTopLeft';
      const idMoveDown =    Statepfad + 'MoveDown';
      const idMoveBottomRight =    Statepfad + 'MoveBottomRight';
      const idMoveBottomLeft =    Statepfad + 'MoveBottomLeft';
      const idStartCruise =     Statepfad + 'StartCruise';
      const idStopCruise =     Statepfad + 'StopCruise';
      const idCruiseTime = Statepfad + 'CruiseTime';
      
      // under construction Hier die Trigger / Klingel und Bewegungsmelder für die Kamera Positionieung eintragen
      
      const idKlingel = 'rpi2.0.gpio.13.state';// Drahtbruchsicher bei mir deshalb wird auf false getriggert
      const idMotionEingang = 'sonoff.0.Wemo_Eingang.POWER5'/*Bewegungsmelder Eingang*/;
      const idMotionCarport = 'sonoff.0.Wemo_Garage.POWER5'/*Bewegungsmelder Carport*/;
      const idMotionGarage = 'hm-rpc.0.PEQ0390467.1.MOTION'/*Bewegungsmelder Vorgarten MOTION*//*Bewegungsmelder Carport*/;
      
      // Anlegen der States für Vis
      createState(idAnhaltezeit, 1, fC, {def: 0,min: 0,name: 'Kamera Zoom Stopzeit',desc: 'Dauer in Sekunden bis zum Stop der Zoom Bewegung',type: 'number',unit: 's'});
      createState(idPosTag, false, fC, {def:  false,name: 'Tagesposition',desc: 'State Vis Tagesposition', type: 'boolean' } );
      createState(idPosNacht, false, fC, {def:  true,name: 'Nachtposition',desc: 'State Vis Nachtposition', type: 'boolean' } );
      createState(idAstro, false, fC, {def:  true,name: 'Astrofunktion',desc: 'Kamera nach nach Astro verfahren ', type: 'boolean' } );
      createState(idStopzeit, 1, fC, {def: 0,min: 0,name: 'Zeit bis stop be Bewegung der Kamera',desc: 'Dauer in Sekunden bis zum Stop der Bewegung',type: 'number',unit: 's'});
      
      
      createState(idReset, false, fC, {def: false,name: 'Kamera PTZ Reset',desc: 'Default Position anfahren',type: 'boolean',role: 'switch'});
      createState(idStopRun, false, fC, {def: false,name: 'Kamera PTZ Stop',desc: 'Sofortiger Stop der Bewegung',type: 'boolean',role: 'switch'});
      createState(idZoomIn, false, fC, {def: false,name: 'Kamera PTZ Zoom in',desc: 'Bild vergößern',type: 'boolean',role: 'switch'});
      createState(idZoomOut, false, fC, {def: false,name: 'Kamera PTZ Zoom out',desc: 'Bild verkleinern',type: 'boolean',role: 'switch'});
      createState(idZoomStop, false, fC, {def: false,name: 'Kamera PTZ Zoom stop',desc: 'Bild Zoom stop',type: 'boolean',role: 'switch'});
      createState(idGotoPreset, 0, fC, {def: 0,min: 0,max: 8,name: 'Kamera PTZ Position wählen',desc: 'Preset auswählen (Zahlen von 1 bis X)',type: 'number'});
      createState(idSpeed, 0, fC, {def: 0,min: 0,max: 4,name: 'Kamera PTZ Geschwindkeit bei Bewegung',desc: 'Geschwindigkeit von 0-4 bei der Bewegung',type: 'number',states: { 0: 'sehr schnell' , 1:  'schnell' , 2:  'normal' , 3: 'langsam' ,4: 'sehr langsam' }});
      createState(idMoveRight, false, fC, {def: false,name: 'Kamera PTZ rechts',desc: 'Bewegung nach rechts',type: 'boolean',role: 'switch'});
      createState(idMoveLeft, false, fC, {def: false,name: 'Kamera PTZ links',desc: 'Bewegung nach links',type: 'boolean',role: 'switch'});
      createState(idMoveUp, false, fC, {def: false,name: 'Kamera PTZ oben',desc: 'Bewegung nach oben',type: 'boolean',role: 'switch'});
      createState(idMoveTopRight, false, fC, {def: false,name: 'Kamera PTZ oben rechts',desc: 'Bewegung nach obenrechts',type: 'boolean',role: 'switch'});
      createState(idMoveTopLeft, false, fC, {def: false,name: 'Kamera PTZ oben links',desc: 'Bewegung nach obenlinks',type: 'boolean',role: 'switch'});
      createState(idMoveDown, false, fC, {def: false,name: 'Kamera PTZ unten',desc: 'Bewegung nach unten',type: 'boolean',role: 'switch'});
      createState(idMoveBottomRight, false, fC, {def: false,name: 'Kamera  PTZ unten rechts',desc: 'Bewegung nach untenrechts',type: 'boolean',role: 'switch'});
      createState(idMoveBottomLeft, false, fC, {def: false,name: 'Kamera  PTZ unten links',desc: 'Bewegung nach untenlinks',type: 'boolean',role: 'switch'});
      createState(idStartCruise, false, fC, {def: false,name: 'Kamera PTZ Positionen abfahren',desc: 'in der Kamera konfigurite Positionsfahrt wird gestartet',type: 'boolean',role: 'switch'});
      createState(idStopCruise, false, fC, {def: false,name: 'Kamera PTZ Positionen abfahren',desc: 'in der Kamera konfigurite Positionsfahrt wird gestoppt',type: 'boolean',role: 'switch'});
      createState(idCruiseTime, 1, fC, {def: 1,min: 1,max:5,name: 'Kamera  PTZ CruiseTime',type: 'number',desc:'1 = 5min , 2 = 10min , 3 = 15min , 4 = 20min , 5 = 25min',states: { 1: ' 5min' , 2:  '10min' , 3:  '15min' , 4: '20min' ,5: '25min' }});
      
      
      // Variable logging aktivieren deaktivieren
      
      var logging = true;
      
      // Variable debug aktivieren deaktivieren
      
      var debug = true;
      
      // Variable http Request hier eintragen ( IP, Presetname , User und Paßwort der Kamera) evtl CGI Befehle anpassen
      
      var PresetTag = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=XXXXXX_Autos&usr=XXXXXX&pwd=XXXXXX';
      var PresetNacht = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=XXXXXX_komplett&usr=XXXXXX&pwd=XXXXXX';
      
      var Preset1 = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=XXXXXX&usr=XXXXXX&pwd=XXXXXX';
      var Preset2 = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=XXXXXX&usr=XXXXXX&pwd=XXXXXX';
      var Preset3 = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=XXXXXXt&usr=XXXXXX&pwd=XXXXXX';
      var Preset4 = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=XXXXXX&usr=XXXXXX&pwd=XXXXXX';
      var Preset5 = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=XXXXXX&usr=XXXXXX&pwd=XXXXXX';
      var Preset6 = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=XXXXXX&usr=XXXXXX&pwd=XXXXXX';
      var Preset7 = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=XXXXXX&usr=XXXXXX&pwd=XXXXXX';
      var Preset8 = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=XXXXXX&usr=XXXXXX&pwd=XXXXXX';
      
      // PTZ Befehle
      
      var Reset = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ptzReset&usr=XXXXXX&pwd=XXXXXX';
      
      var StopRun = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ptzStopRun&usr=XXXXXX&pwd=XXXXXX';
      
      var ZoomIn = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ZoomIn&usr=XXXXXX&pwd=XXXXXX';
      var ZoomOut = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=ZoomOut&usr=XXXXXX&pwd=XXXXXX';
      var ZoomStop = 'http://192.168.XX.XX/cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=XXXXXX&pwd=XXXXXX';
      
      var Speed0 = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=setPTZSpeed&speed=0&usr=XXXXXX&pwd=XXXXXX';
      var Speed1 = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=setPTZSpeed&speed=1&usr=XXXXXX&pwd=XXXXXX';
      var Speed2 = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=setPTZSpeed&speed=2&usr=XXXXXX&pwd=XXXXXX';
      var Speed3 = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=setPTZSpeed&speed=3&usr=XXXXXX&pwd=XXXXXX';
      var Speed4 = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=setPTZSpeed&speed=4&usr=XXXXXX&pwd=XXXXXX';
      
      var MoveRight = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=ptzMoveRight&usr=XXXXXX&pwd=XXXXXX';
      var MoveLeft = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=ptzMoveLeft&usr=XXXXXX&pwd=XXXXXX';
      var MoveUp = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=ptzMoveUp&usr=XXXXXX&pwd=XXXXXX';
      var MoveDown = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=ptzMoveDown&usr=XXXXXX&pwd=XXXXXX';
      var MoveTopLeft = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=ptzMoveTopLeft&usr=XXXXXX&pwd=XXXXXX';
      var MoveTopRight = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=ptzMoveTopRight&usr=XXXXXX&pwd=XXXXXX';
      var MoveBottomLeft = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=ptzMoveBottomLeft&usr=XXXXXX&pwd=XXXXXX';
      var MoveBottomRight = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=ptzMoveBottomRight&usr=XXXXXX&pwd=XXXXXX';
      
      var StartCruise = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=ptzStartCruise&mapName=test&usr=XXXXXX&pwd=XXXXXX';
      var StopCruise = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=ptzStopCruise&usr=XXXXXX&pwd=XXXXXX';
      
      var CruiseTime1 = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=setCruiseTime&time=5&usr=XXXXXX&pwd=XXXXXX';
      var CruiseTime2 = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=setCruiseTime&time=10&usr=XXXXXX&pwd=XXXXXX';
      var CruiseTime3 = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=setCruiseTime&time=15&usr=XXXXXX&pwd=XXXXXX';
      var CruiseTime4 = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=setCruiseTime&time=20&usr=XXXXXX&pwd=XXXXXX';
      var CruiseTime5 = 'http://192.168.XX.XX//cgi-bin/CGIProxy.fcgi?cmd=setCruiseTime&time=25&usr=XXXXXX&pwd=XXXXXX';
      
      
      /********************Ab hier muss nix mehr geändert werden******************************/
      
      //######################################################
      //Cruise / Presetfahrten / Überwachungsfahrt starten
      
      on(idStartCruise, function (obj) {
         if (!obj.state.ack && obj.state.val) {
          if(debug)log('Überwachungsfahrt der Kamera Presetpositionen gestartet');
          setStateDelayed(idStartCruise, false, 500);
             request(StartCruise) , function (error, response){
          if(debug && error)log(error, 'error');    
      
             }
          }
      });
      
      //Cruise / Presetfahrten / Überwachungsfahrt stoppen
      
      on(idStopCruise, function (obj) {
         if (!obj.state.ack && obj.state.val) {
                 if(debug)log('Überwachungsfahrt der Kamera Presetpositionen gestoppt');
          setStateDelayed(idStopCruise, false, 500);
             request(StopCruise) , function (error, response){
          if(debug && error)log(error, 'error');    
      
             }
          }
      });
      
      //Cruise / Presetfahrten / Überwachungsfahrt Zeit einstellen
      
      
      //Fahrgeschwindigkeit ändern
      on(idCruiseTime , function (obj) {
          if (!obj.state.ack && obj.state.val) {
              var selectT = getState(idCruiseTime).val;
              if(selectT === 1)setCruiseT1();
              if(selectT === 2)setCruiseT2();
              if(selectT === 3)setCruiseT3();
              if(selectT === 4)setCruiseT4();
              if(selectT === 5)setCruiseT5();    
              if(logging)log(['Kontrollfahrtzeit eingestellt auf Vorwahl  ',getState(idCruiseTime).val].join('')); 
          }
      });    
      
      function setCruiseT1(){
          if(debug)log('Funktion setCruiseT1 ausgeführt, Request URL CruiseTime1');
      request(CruiseTime1) , function (error, response){
      if(debug && error)log(error, 'error');
      }
      }
      
      function setCruiseT2(){
          if(debug)log('Funktion setCruiseT2 ausgeführt, Request URL CruiseTime2');
      request(CruiseTime2) , function (error, response){
      if(debug && error)log(error, 'error');
      
      }
      } 
      
      function setCruiseT3(){
          if(debug)log('Funktion setCruiseT3 ausgeführt, Request URL CruiseTime3');
      request(CruiseTime3) , function (error, response){
      if(debug && error)log(error, 'error');
      
      }
      } 
      
      function setCruiseT4(){
          if(debug)log('Funktion setCruiseT4 ausgeführt, Request URL CruiseTime4');
      request(CruiseTime4) , function (error, response){
      if(debug && error)log(error, 'error');
      
      }
      } 
      
      function setCruiseT5(){
          if(debug)log('Funktion setCruiseT5 ausgeführt, Request URL CruiseTime5');
      request(CruiseTime5) , function (error, response){
      if(debug && error)log(error, 'error');
      
      }
      } 
      
      //######################################################
      
      //Fahrgeschwindigkeit ändern
      on(idSpeed , function (obj) {
              var select = getState(idSpeed).val;
              if(select === 0)setspeed0();
              if(select === 1)setspeed1();
              if(select === 2)setspeed2();
              if(select === 3)setspeed3();
              if(select === 4)setspeed4();    
              if(logging)log(['Fahrgeschwindigkeit eingestellt Stufe  ',getState(idSpeed).val].join('')); 
      });    
      
      function setspeed0(){
          if(debug)log('Funktion setspeed0 ausgeführt, Request URL Speed0');
      request(Speed0) , function (error, response){
      if(debug && error)log(error, 'error');
      
      }
      }   
      
      function setspeed1(){
          if(debug)log('Funktion setspeed1 ausgeführt, Request URL Speed1');
      request(Speed1) , function (error, response){
      if(debug && error)log(error, 'error');
      
      }
      }   
      
      function setspeed2(){
          if(debug)log('Funktion setspeed2 ausgeführt, Request URL Speed2');
      request(Speed2) , function (error, response){
      if(debug && error)log(error, 'error');
      
      }
      }  
      
      function setspeed3(){
          if(debug)log('Funktion setspeed3 ausgeführt, Request URL Speed3');
      request(Speed3) , function (error, response){
      if(debug && error)log(error, 'error');
      
      }
      }  
      
      function setspeed4(){
          if(debug)log('Funktion setspeed4 ausgeführt, Request URL Speed4');
      request(Speed4) , function (error, response){
      if(debug && error)log(error, 'error');
      
      }
      }  
      
      
      
      
      
      //########################################################
      
      //Positionieren stoppen
      on(idStopRun, function (obj) {
         if (!obj.state.ack && obj.state.val) {
                 if(logging)log('Positionierung manuell gestoppt');
                     setStateDelayed(idStopRun, false, 500);
                     StopRunning();
      
          }
      });
      
      
      function StopRunning (){
          if(debug)log('Funktion StopRunning ausgeführt, Request URL StopRun');
          
          request(StopRun) , function (error, response){
          if(debug && error)log(error, 'error');    
             }
      }
      
      //########################################################
      
      //Homeposition anfahren
      on(idReset, function (obj) {
         if (!obj.state.ack && obj.state.val) {
                 if(debug)log('Homeposition manuell angefahren');
                     setStateDelayed(idReset, false, 500);
          request(Reset) , function (error, response){
          if(debug && error)log(error, 'error');    
              }
          }
      });
      
      //########################################################
      
      // Positionieren Hoch runter links recht obenlinksrechts untenlinksrechts manuell
      
      // Links
      on(idMoveLeft, function (obj) {
         if (!obj.state.ack && obj.state.val) {
            var Stoppzeit = getState(idAnhaltezeit).val;
            LeftMoving();
            setTimeout(StopRunning,Stoppzeit*1000);
            setStateDelayed(idMoveLeft, false, 500);
            if(logging)log('Funktion LeftMoving gestartet');
         }
      });
      
      
      function LeftMoving(){
          if(debug)log('Funktion LeftMoving ausgeführt, Request URL MoveLeft');
      request(MoveLeft) , function (error, response){
      if(debug && error)log(error, 'error');    
      
      }
      }  
      
      //rechts
      on(idMoveRight, function (obj) {
         if (!obj.state.ack && obj.state.val) {
            var Stoppzeit = getState(idAnhaltezeit).val;
            RightMoving();
            setTimeout(StopRunning,Stoppzeit*1000);
            setStateDelayed(idMoveRight, false, 500);
            if(logging)log('Funktion RightMoving gestartet');
         }
      });
      
      
      function RightMoving(){
          if(debug)log('Funktion RighttMoving ausgeführt, Request URL MoveRight');
      request(MoveRight) , function (error, response){
      if(debug && error)log(error, 'error');    
      
      }
      } 
      
      
      
      // hochrechts
      on(idMoveTopRight, function (obj) {
         if (!obj.state.ack && obj.state.val) {
            var Stoppzeit = getState(idAnhaltezeit).val;
            TopRightMoving();
            setTimeout(StopRunning,Stoppzeit*1000);
            setStateDelayed(idMoveTopRight, false, 500);
            if(logging)log('Funktion TopRightMoving gestartet');
         }
      });
      
      
      function TopRightMoving(){
          if(debug)log('Funktion TopRighttMoving ausgeführt, Request URL MoveTopRight');
      request(MoveTopRight) , function (error, response){
      if(debug && error)log(error, 'error');    
      
      }
      } 
      
      // hochlinks
      on(idMoveTopLeft, function (obj) {
         if (!obj.state.ack && obj.state.val) {
            var Stoppzeit = getState(idAnhaltezeit).val;
            TopLeftMoving();
            setTimeout(StopRunning,Stoppzeit*1000);
            setStateDelayed(idMoveTopLeft, false, 500);
            if(logging)log('Funktion TopLeftMoving gestartet');
         }
      });
      
      
      function TopLeftMoving(){
          if(debug)log('Funktion TopLeftMoving ausgeführt, Request URL MoveTopLeft');
      request(MoveTopLeft) , function (error, response){
      if(debug && error)log(error, 'error');    
      
      }
      }
      
      // runterrechts
      on(idMoveBottomRight, function (obj) {
         if (!obj.state.ack && obj.state.val) {
            var Stoppzeit = getState(idAnhaltezeit).val;
            BottomRightMoving();
            setTimeout(StopRunning,Stoppzeit*1000);
            setStateDelayed(idMoveBottomRight, false, 500);
            if(logging)log('Funktion BottomRightMoving gestartet');
         }
      });
      
      
      function BottomRightMoving(){
          if(debug)log('Funktion BottomRighttMoving ausgeführt, Request URL MoveBottomRight');
      request(MoveBottomRight) , function (error, response){
      if(debug && error)log(error, 'error');    
      
      }
      }
      
      // runterlinks
      on(idMoveBottomLeft, function (obj) {
         if (!obj.state.ack && obj.state.val) {
            var Stoppzeit = getState(idAnhaltezeit).val;
            BottomLeftMoving();
            setTimeout(StopRunning,Stoppzeit*1000);
            setStateDelayed(idMoveBottomLeft, false, 500);
            if(logging)log('Funktion BottomLeftMoving gestartet');
         }
      });
      
      
      function BottomLeftMoving(){
          if(debug)log('Funktion BottomLefttMoving ausgeführt, Request URL MoveBottomLeft');
      request(MoveBottomLeft) , function (error, response){
      if(debug && error)log(error, 'error');    
      
      }
      }
      
      // oben
      on(idMoveUp, function (obj) {
         if (!obj.state.ack && obj.state.val) {
            var Stoppzeit = getState(idAnhaltezeit).val;
            UpMoving();
            setTimeout(StopRunning,Stoppzeit*1000);
            setStateDelayed(idMoveUp, false, 500);
            if(logging)log('Funktion UpMoving gestartet');
         }
      });
      
      
      function UpMoving(){
          if(debug)log('Funktion UptMoving ausgeführt, Request URL MoveUp');
      request(MoveUp) , function (error, response){
      if(debug && error)log(error, 'error');    
      }
      }
      
      
      // runter
      on(idMoveDown, function (obj) {
         if (!obj.state.ack && obj.state.val) {
            var Stoppzeit = getState(idAnhaltezeit).val;
            DownMoving();
            setTimeout(StopRunning,Stoppzeit*1000);
            setStateDelayed(idMoveDown, false, 500);
            if(logging)log('Funktion DownMoving gestartet');
         }
      });
      
      
      function DownMoving(){
          if(debug)log('Funktion DowntMoving ausgeführt, Request URL MoveDown');
      request(MoveDown) , function (error, response){
      if(debug && error)log(error, 'error');    
      
      }
      }
      
      
      //########################################################
      
      //Preset anfahren
      on(idGotoPreset , function (obj) {
          if (!obj.state.ack && obj.state.val) {
              var preset = getState(idGotoPreset).val;
              if(logging)log(['Funktion gestartet,  Preset Postion ',getState(idGotoPreset).val].join('')); 
              if(preset === 1){
                  GoTo1();
                  }else{
                     if(preset === 2){
                         GoTo2();
                         }else{
                          if(preset === 3){
                              GoTo3();
                              }else{
                              if(preset === 4){
                                  GoTo4();
                                  }else{
                                  if(preset === 5){
                                      GoTo5();
                                      }else{
                                      if(preset === 6){
                                          GoTo6();
                                              }else{
                                              if(preset === 7){
                                                  GoTo7();
                                                  }else{
                                                  if(preset === 8){
                                                      GoTo8();   
                                              }
                                          }
                                      }
                                  }
                              }
                          }
                     } 
              }
          }
      });
      
      function GoTo1(){
      if(debug)log('Funktion GoTo1 ausgeführt, Request URL Preset 1');
      request(Preset1) , function (error, response){
      if(debug && error)log(error, 'error');
      }
      }    
      
      function GoTo2(){
      if(debug)log('Funktion GoTo2 ausgeführt, Request URL Preset 2');  
      request(Preset2) , function (error, response){
      if(debug && error)log(error, 'error');    
      }
      } 
      
      function GoTo3(){
      if(debug)log('Funktion GoTo3 ausgeführt, Request URL Preset 3');   
      request(Preset3) , function (error, response){
      if(debug && error)log(error, 'error');    
      }
      } 
      
      function GoTo4(){
      if(debug)log('Funktion GoTo4 ausgeführt, Request URL Preset 4');
      request(Preset4) , function (error, response){
      if(debug && error)log(error, 'error');
      }
      } 
      
      function GoTo5(){
      if(debug)log('Funktion GoTo5 ausgeführt, Request URL Preset 5');
      request(Preset5) , function (error, response){
      if(debug && error)log(error, 'error');    
      }
      } 
      
      function GoTo6(){
      if(debug)log('Funktion GoTo6 ausgeführt, Request URL Preset 6');
      request(Preset6) , function (error, response){
      if(debug && error)log(error, 'error');
      }
      } 
      
      function GoTo7(){
      if(debug)log('Funktion GoTo7 ausgeführt, Request URL Preset 7');    
      request(Preset7) , function (error, response){
      if(debug && error)log(error, 'error');    
      }
      } 
      
      function GoTo8(){
      if(debug)log('Funktion GoTo8 ausgeführt, Request URL Preset 8');
      request(Preset8) , function (error, response){
      if(debug && error)log(error, 'error');
      }
      } 
      
      //########################################################
      
      // Für Vis PresetButton zurück setzen
      
      on({id: [idReset,idStopRun, idZoomOut, idZoomIn,idZoomStop,idMoveBottomLeft,idMoveBottomRight, idMoveDown, idMoveUp, idMoveBottomLeft, idMoveBottomRight, idMoveTopLeft, idMoveTopRight, idMoveLeft, idMoveRight, idReset, idStopCruise, idStartCruise], 
         change: 'any'
      }, function (obj) {
         if (!obj.state.ack && obj.state.val) {
            setState(idGotoPreset, 0);
            if(logging)log(' State GotoPreset für Vis Anzeige zurückgesetzt');
         }
      });
      
      //########################################################
      
      // vergrößern manuell
      
      on(idZoomIn, function (obj) {
         if (!obj.state.ack && obj.state.val) {
            var Stopzeit = getState(idAnhaltezeit).val;
            Bigzoomen();
            setTimeout(Stopzoomen,Stopzeit*1000);
            setStateDelayed(idZoomIn, false, 500);
            if(logging)log('Funktion Bigzoomen gestartet');
      
         }
      });
      
      
      function Bigzoomen(){
          if(debug)log('Funktion Bigzoomen ausgeführt, Request URL ZoomIn');
      request(ZoomIn) , function (error, response){
      if(debug && error)log(error, 'error');    
      
          
      }
      }
      
      // verkleinern manuell
      
      on(idZoomOut, function (obj) {
         if (!obj.state.ack && obj.state.val) {
            var Stopzeit = getState(idAnhaltezeit).val;
            Smallzoomen();
            setTimeout(Stopzoomen,Stopzeit*1000);
            setStateDelayed(idZoomOut, false, 500);
           if(logging)log('Funktion Smallzoomen gestartet');
      
         }
      });
      
      
      function Smallzoomen(){
          if(debug )log('Funktion Smallzoomen ausgeführt, Request URL ZoomOut');  
      request(ZoomOut) , function (error, response){
      if(debug && error)log(error, 'error');    
        
      }
      }
      
      //zoom Stopen manuell
      
      on(idZoomStop, function (obj) {
         if (!obj.state.ack && obj.state.val) {
            Stopzoomen();
            setStateDelayed(idZoomStop, false, 500);
            if(logging)log('Funktion Stopzoomen gestartet');
      
         }
      });
      
      
      function Stopzoomen(){
          if(debug)log('Funktion Stopzoomen ausgeführt, Request URL ZoomStop');
      request(ZoomStop) , function (error, response){
      if(debug && error)log(error, 'error');    
      
      }
      }   
      
      //########################################################
      // Funktionslogik Sonnenaufgang
      
      function Sonnenaufgang(){
      var Astro = getState (idAstro).val;
      setState(idPosTag,true,true);
      setState(idPosNacht,false,true);
      if(Astro){
          if (debug)log('Funktion Sonnenaufgang ausgeführt, Request URL PresetTag ');
      request(PresetTag), function (error, response){
      if(debug && error)log(error, 'error');    
      } 
      }
      }
      
      // Funktionslogik Sonnenuntergang
      
      function Sonnenuntergang(){
      var Astro = getState (idAstro).val;
      setState(idPosTag,false,true);
      setState(idPosNacht,true,true);
      if(Astro){
          if (debug)log('Funktion Sonnenuntergang ausgeführt, Request URL PresetNacht ');
      request(PresetNacht), function (error, response){
      if(debug && error)log(error, 'error');    
      
      }
      }
      } 
      
      //########################################################
      
      // Skriptstart
      
      Scriptstart();
      
      // Funktion Skriptstart
      
      function Scriptstart(){
      var Tag = getState(idPosTag).val;
      var Nacht = getState(idPosNacht).val;
      if (Tag === true && Nacht === false){
      Sonnenaufgang();
      if (debug)log('Skriptstart Tagprogramm ');
      }else{
      if (Nacht === true && Tag === false){
      Sonnenuntergang();
      if (debug)log('Skriptstart Nachtprogramm');
      }else{
      if (Tag === true && Nacht === true){
      if(debug)log('Logikfehler Tag und Nacht aktiv')	
      			}
      
      		}
      
      	}
      
      }
      
      //########################################################
      
      // Trigger Sonnenaufgang
      
      schedule({astro: "sunrise"}, function () {//Sonnenaufgang
      Sonnenaufgang();
      if(logging)log('Funktion Sonnenaufgang gestartet')	
      });
      
       
      // Trigger Sonnenuntergang
      schedule({astro: "sunset"}, function () {//Sonnenuntergang
      Sonnenuntergang();
      if(logging)log('Funktion Sonnenuntergang gestartet')	
      });
      
      1 Reply Last reply Reply Quote 0
      • Wiednitz
        Wiednitz last edited by Wiednitz

        entfernt

        smartboart 1 Reply Last reply Reply Quote 0
        • smartboart
          smartboart @Wiednitz last edited by smartboart

          @Wiednitz
          vlt. kannst du mal deine Erkenntnisse bzw. bereits getestetn CGI Befehle / Request Html zum Besten geben, welche du bereits erfolgreich getestet hast.
          Mein anderes Skript dazu läuft mittels ONVIF , aber hier funktionieren die Presets nicht. Deshalb ist mein obiges Skript auch für mich sinning, wenn es denn bei mir funktioniert. Wie gesagt bisher nur onvif...
          Habe bereits ein Skript laufen mit welchem ich manuell mittels onvif verfahren kann.
          Aber mittels CGI könnte das auch direkt in Vis gehen. Frühere Versuche meinerseits waren bei der onvif nicht erfolgreich.

          Mir fallen da noch andere Sachen ein, z.B nach Bewegung oder Klingel die entsprechenden Presets anfahren.
          Hoffe ich bekomme die Presets zum laufen mittes CGI.

          Wiednitz 1 Reply Last reply Reply Quote 0
          • Wiednitz
            Wiednitz @smartboart last edited by Wiednitz

            @smartboart

            Ha mit Hausklingel habe ich gestern erst fertiggestellt, läuft 1a. Normales klingeln, Kamera fährt auf PTZ Hoftor, zoomt heran, macht Foto für Telegram, fährt wieder auf Ursprung zurück und es Klingeln alle Telefone an der Fritzbox, wichtig wenn im Garten. Langes klingeln -einstellbar- das Gleiche, öffnet zusätzlich Tor für zum Beispiel Postbote, muss ihm natürlich mitgeteilt werden bei Nachricht für Ablageort.

            Script ist schon Recht umfangreich und Blockly ;). Kann ich gern einstellen.

            1 Reply Last reply Reply Quote 0
            • smartboart
              smartboart last edited by smartboart

              Alsoich habe mit dem CGI nicht so tolle Erfahrung ..ausser für snap benutze ich es nicht. Der Link
              http://192.168.xx.xx/cgi-bin/hi3510/preset.cgi?-act=goto&-number=5?usr=xxxxxx&pwd=xxxxx
              funktioniert bei mir schomal nicht...hast ne idee?

              Antwort 404 not found

              Wiednitz 1 Reply Last reply Reply Quote 0
              • smartboart
                smartboart last edited by

                mein snap sieht so aus...der geht..
                http://192.168.xx.xx/cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=xxx&pwd=xxxx

                Wiednitz 1 Reply Last reply Reply Quote 0
                • Wiednitz
                  Wiednitz @smartboart last edited by Wiednitz

                  @smartboart

                  Probier mal

                  /cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=test&usr=admin&pwd=

                  Hast du PTZ Nummern ?

                  smartboart 1 Reply Last reply Reply Quote 0
                  • smartboart
                    smartboart last edited by

                    ja habe nummern 5, 6 ,7 ,8 11 und 12 aktiv in Vis mittels Onvif script, funktioniert aber nur wenn der token vorher im browser aktiv war. deshalb ist mir die Lösung hier lieber

                    Wiednitz 1 Reply Last reply Reply Quote 0
                    • Wiednitz
                      Wiednitz @smartboart last edited by

                      @smartboart

                      Deine SNAP url geht bei mir nicht, ich nehme

                      http://192.168.10.68/tmpfs/auto.jpg?

                      1 Reply Last reply Reply Quote 0
                      • smartboart
                        smartboart @Wiednitz last edited by

                        @Wiednitz sagte in IPCam FI9928P Position nach Astro http Request:

                        /cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=test&usr=admin&pwd=

                        bekomme als result

                        <CGI_Result>
                        <result>0</result>
                        <runResult>1</runResult>
                        </CGI_Result>

                        Wiednitz 1 Reply Last reply Reply Quote 0
                        • Wiednitz
                          Wiednitz @smartboart last edited by

                          @smartboart

                          Onvif hab ich auch, aber noch nicht mit beschäftigt. Videostream geht ja im vis eh nicht unter Windows 10

                          smartboart 1 Reply Last reply Reply Quote 0
                          • smartboart
                            smartboart @Wiednitz last edited by

                            @Wiednitz ja habe mich nur damit beschäftigt, weilich cginicht hinbekommen habe..Hatte jetzt nur Hoffnung weil es bei deiner Cam geht....Ist. vlt. nen Firmware ding..
                            <CGI_Result>
                            <result>0</result>
                            <runResult>1</runResult>
                            </CGI_Result>
                            alsoich bekomme den Ressult , passiert aber nix...

                            1 Reply Last reply Reply Quote 0
                            • Wiednitz
                              Wiednitz @smartboart last edited by Wiednitz

                              @smartboart

                              Foscam 9928 CGI pdf

                              Sollte ähnlich wie bei mir funktionieren !?

                              smartboart 1 Reply Last reply Reply Quote 0
                              • smartboart
                                smartboart last edited by

                                Ja, das Dokument hatte ich glaube ich auch schon..Schau mir das mal morgen in Ruhe an...Muss jetzt schluss machen....Frau quengelt schon....Bis dann!!!!

                                1 Reply Last reply Reply Quote 0
                                • smartboart
                                  smartboart @Wiednitz last edited by

                                  @Wiednitz Alter das geht...ich muss statt der Nummer den Namen eintragen ( Vorgarten_Autos) schon klappts!!!!!!!!

                                  Wiednitz 1 Reply Last reply Reply Quote 0
                                  • Wiednitz
                                    Wiednitz @smartboart last edited by

                                    @smartboart

                                    Wollte grad schreiben, kann keine Zahl sein, fragte ja erst schon. Hatte das eben noch gefunden:

                                    L’api Foscam FI9928P
                                    Voici les différentes commandes API que j’ai ajouté dans la vidéo ci-dessus :

                                    Flux vidéo : http://IP:port/cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=#username#&pwd=#password#
                                    Position (ici la position syno0) : http://IP:port/cgi-bin/CGIProxy.fcgi?cmd=ptzGotoPresetPoint&name=syno0&usr=#username#&pwd=#password#
                                    Zoom + : http://IP:port/cgi-bin/CGIProxy.fcgi?cmd=zoomIn&usr=#username#&pwd=#password#
                                    Zoom – : /cgi-bin/CGIProxy.fcgi?cmd=zoomOut&usr=#username#&pwd=#password#
                                    Arrêt du zoom : /cgi-bin/CGIProxy.fcgi?cmd=zoomStop&usr=#username#&pwd=#password#

                                    Bis später...

                                    smartboart 1 Reply Last reply Reply Quote 0
                                    • smartboart
                                      smartboart @Wiednitz last edited by

                                      @Wiednitz Danke!!!

                                      Wiednitz 1 Reply Last reply Reply Quote 0
                                      • Wiednitz
                                        Wiednitz @smartboart last edited by Wiednitz

                                        @smartboart

                                        Gerne....

                                        Script läuft doch nicht wie gewünscht. Wenn ich es jetzt starte, geht es auf Tagprogramm und damit auf PTZ Tag !?

                                        javascript.0	2019-12-01 23:39:41.058	info	script.js.IPCam_TagNachtPTZ: registered 0 subscriptions and 2 schedules
                                        javascript.0	2019-12-01 23:39:41.058	info	script.js.IPCam_TagNachtPTZ: Skriptstart Tagprogramm
                                        javascript.0	2019-12-01 23:39:41.057	info	Start javascript script.js.IPCam_TagNachtPTZ
                                        

                                        Bin mir jetzt unsicher, ob es mit Version 2 erst funktioniert hat oder nicht !?

                                        So, jetzt erstmal Matratzenhorchdienst ^^

                                        smartboart 2 Replies Last reply Reply Quote 0
                                        • smartboart
                                          smartboart @Wiednitz last edited by

                                          @Wiednitz sagte in IPCam FI9928P Position nach Astro http Request:

                                          Bin mir jetzt unsicher, ob es mit Version 2 erst funktioniert hat oder nicht !?

                                          Hallo,

                                          ich hatte während dem das Script online war noch diverse Anpassungen gemacht. Vlt. Hast du nen Zwischenstand abgerufen.
                                          Ich habe oben aktualisiert , ein weiteres Loglevel implementiert und die Logik Scriptstart überarbeitet - Tag / Nacht wird in den states gespeichert.

                                          bei erstmaliger Ausführung müssen die Zustände Tagesposition / Nachtposition stimmen. Spätestens beim nächsten Schedule( Astro Trigger )
                                          stimmen die States dann automatisch. Sollte eigentlich reichen.
                                          Ich verwende die beiden States hier auch als Merker. Wenn du aber z.B Tagsüber dein System herunterfährst und ers Nachts wieder hochfährst stimmt die Tageszeit natürlich nicht. Der Astro Schedule ist ein Trigger der immer nur einmal am Tag aktiv ist. Ist das System zu diesem Zeitpunkt aus oder das skript angehalten, erfolgt natürlich kein Weichsel der Tageszeit. Das passiert erst dann wieder beim nächsten schedule. Dann stimmen auch wieder die Zustände..
                                          Dass musst du halt wissen.
                                          Wenn du aus irgendwelchen Gründen ständig deine Skipte anhälst oder das System pausierst, was für mich keinen Sinn ergibt, ausser bei Wartungsarbeiten, kann das halt vorkommen.
                                          Dann müsste ich in den Skriptstart eine is Time in Range abfrage einbauen..

                                          Aber ich denke das sollte so reichen.

                                          1 Reply Last reply Reply Quote 0
                                          • smartboart
                                            smartboart last edited by

                                            Achso, habe das Script ab V.0.04 jetzt nicht ausprobiert, bin nicht zu Hause... Wenn ich mich irgendwo vertippt habe oder ein paar Sonderzeichen vergessen habe sei es mir verziehen.

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            760
                                            Online

                                            31.6k
                                            Users

                                            79.5k
                                            Topics

                                            1.3m
                                            Posts

                                            2
                                            32
                                            1574
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo