Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Boronsbruder

    NEWS

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Wir empfehlen: Node.js 22.x

    • Profile
    • Following 0
    • Followers 0
    • Topics 12
    • Posts 383
    • Best 55
    • Groups 2

    Boronsbruder

    @Boronsbruder

    69
    Reputation
    85
    Profile views
    383
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    Boronsbruder Follow
    Pro Starter

    Best posts made by Boronsbruder

    • RE: [Linux Shell-Skript] WLAN-Wetterstation

      Der Fehler liegt in der Berechnung des Meterologischen Sommers und tritt immer um 23:58 Uhr auf!

      Ich warte mal heute Nacht noch ab, aber der Fix sollte folgendes sein:

      @SBorg
      ein Tippfehler in der wetterstation.sub Zeile 1293 und 1294 -> +Y% in +%Y ändern!

      Falsch:

      local FLUXSTART=$(date +Y%-06-01)"T00:00:00Z"
      local FLUXENDE=$(date +Y%-08-31)"T23:59:59Z"
      

      Richtig:

      local FLUXSTART=$(date +%Y-06-01)"T00:00:00Z"
      local FLUXENDE=$(date +%Y-08-31)"T23:59:59Z"
      
      posted in Praktische Anwendungen (Showcase)
      Boronsbruder
      Boronsbruder
    • [Vorlage] Luftqualitätswerte abrufen

      Ich möchte euch mein Skript zum Abrufen der Luftqualitätsdaten über die Api des Umweltbundesamtes zur Verfügung stellen.
      Funktion:
      auf der SEITE des Umwelbundesamtes die StationsID raussuchen
      582e07dc-ceb1-4d47-8e50-73147c3d7d8b-grafik.png
      Es können auch mehrere Stationen durch Komma getrennt im Skript eingetragen werden.
      Dann werden die Daten (letzter Stündlicher Mittelwert) unter dem eingestellten Datenpunkt um **:10 gespeichert. (um 10, nach da ich festgestellt habe, dass manche Werte erst später kommen)

      c8ba31a0-117b-4283-8709-69b904c57a3a-grafik.png

      v2.1 - Datumsfix => Danke an @Sborg
      - Fehlerbehandlung für nicht abgerufene Daten eingebaut
      v2.2 - fix Clear Timeouts und Schedules beim Stoppen
      v2.3 - fix Fehlerbearbeitung
      v2.4 - Die API scheint keine Stunde 0 korrekt verarbeiten zu können, deswegen werden hier zwischen 23 Uhr und 1 Uhr keine Daten geliefert.
      Es wird nur noch "kein Datensatz" geloggt, anstatt einen Fehler auszulösen.
      v2.5 - Abfrage an API angepasst (1- 24 Uhr wird dort gefordert).
      v2.6 - Anpassung zu Sommerzeit-Problemen
      v2.7 - Schönheitskorrekturen im Code
      v2.8 - Werte werden mit ack=true gespeichert

      Hinweis:
      Um den Datumswechsel fehlen meist zwischen 0 und 2 Uhr immer mal wieder Daten, die von der API nicht geliefert werden. Später am Tag sind sie zwar vorhanden, aber das Skript ist nur für die letzten aktuellen Werte gedacht. Dies wird nur als normale Log-Meldung geführt.

      // Luftqualität v2.8
      // v1 - Erst-Version
      // v2 - Qualitätsindizes hinzugefügt
      // v2.1 - Datumsberechnung korrigiert => Danke an @SBorg
      //      - Fehlerbehandlung für nicht abgerufene Daten eingebaut
      // v2.2 - fix Clear Timeouts und Schedules
      // v2.3 - fix Fehlerbearbeitung
      // v2.4 - Die API scheint keine Stunde 0 korrekt verarbeiten zu können, deswegen werden hier zwischen 23 Uhr und 1 Uhr keine Daten geliefert.
      //        Es wird nur noch kein Datensatz gelogt anstatt einen Fehler auszulösen 
      // v2.5 - Abfrage an API angepasst (1- 24 Uhr wird dort gefordert).
      // v2.6 - Anpassung zu Sommerzeit-Problemen
      // v2.7 - Schönheitskorrekturen im Code
      // v2.8 - Werte werden mit ack=true gespeichert
      
      // User Einstellungen
      
      const stations = ["DEBW019", "DEBY052"]; // Stationen, können durch Komma getrennt werden z.B. ["DEBW019", "DEBY007"]
      const datenpunkt_pre ="0_userdata.0" // => wird in 0_userdata.0.Luftqualität gespeichert
      const debug = false;
      //  Abfrage findet um **:10 stündlich statt (um fehlende Daten eventl. nachzufüllen). Die Daten werden sowieso nur stündlich von der letzten Stunde zur Verfügung gestellt...
      
      // Datenverarbeitung 
      
      var dp_path = datenpunkt_pre + ".Luftqualität.";
      var timer;
      var components;
      var stations_list;
      var re_init = false;
      var re_init_timeout;
      
      const fetch = require('node-fetch');
      
      function createBaseFolder(ID, type, name)
      {
      /** geklaut bei grrfield
       * Erstellt Basisfolder und stellt den richtigen Typ ein
       * @param   {string}    ID          ID des Folders
       * @param   {any}       type        Typ des Folders
       * @param   {string}    [name]      (optional) Name des Folders
       */  
      
          createState(ID, function() {
              let obj=getObject(ID);
              obj.type=type;
              if(name != undefined) obj.common.name=name;
              obj.common.role='';
              setObject(ID, obj);
          });
      }
      
      const get_stations = async () => {
          const url_stations = "https://umweltbundesamt.api.proxy.bund.dev/api/air_data/v3/stations/json?lang=de";
          var stations_json = fetch(url_stations)
              .then(response => response.json())
              .then(data => {
                  //if (debug) console.log(data);
                  return data})
              .catch ((err) => {
              console.error("failed fetch " + err);
              
          }
          );
          return stations_json;
      }
      
      const send_request = async (station_code) => {
              
              const d = new Date(); 
              if (debug) console.log ("TIMEZONE: " + d.getTimezoneOffset());
              if (d.getTimezoneOffset() == -120) d.setTime(d.getTime()-3600000);
              
              let month_to = (d.getMonth()+1) < 10 ? "0"+ (d.getMonth()+1) : (d.getMonth()+1);
              let day_to = (d.getDate()) < 10 ? "0"+ (d.getDate()) : (d.getDate());
              let date_to = d.getFullYear() +'-'+ month_to  +'-' + day_to;
              let hour_to = d.getHours();
              
              if (debug) console.log ("to => " + date_to + " " + hour_to);
              
              const now_round = new Date (date_to +' '+ hour_to + ":00");       
              
              let now = now_round.getTime()-3600000;
              
              d.setTime(now);
              
              let month_from = (d.getMonth()+1) < 10 ? "0"+ (d.getMonth()+1) : (d.getMonth()+1);
              let day_from = (d.getDate() < 10) ? "0"+ (d.getDate()) : d.getDate();
              let date_from = d.getFullYear() +'-'+ month_from +'-' + day_from;
              let hour_from = d.getHours();
              if (debug) console.log ("from => " + date_from + " " + hour_from);
      
              if (hour_to == 0){
                  hour_to =24;
                  date_to = date_from
                  if (debug) console.warn ("STUNDE 0 => to => " + date_to + " " + hour_to);
              }
              else if (hour_from == 0){
                  let fixed_now = d.getTime()-3600000;
                  d.setTime(fixed_now);
      
                  month_from = (d.getMonth()+1) < 10 ? "0"+ (d.getMonth()+1) : (d.getMonth()+1);
                  day_from = (d.getDate() < 10) ? "0"+ (d.getDate()) : d.getDate();
                  date_from = d.getFullYear() +'-'+ month_from +'-' + day_from;
                  hour_from = 24;
                  if (debug) console.warn ("STUNDE 0 => from => " + date_from + " " + hour_from);
              }
      
              
              const url_server = "https://umweltbundesamt.api.proxy.bund.dev/api/air_data/v3/airquality/json?date_from=" + date_from + "&time_from=" + hour_from + "&date_to=" +date_to +"&time_to=" + hour_to + "&station=" + station_code + "&lang=de";
              
              if (debug) console.log("SERVER-URL: "+ url_server);
      
              var request = fetch(url_server)
              .then(response => response.json())
              .then(data => {
                  if (debug) console.log(data);
                  return data})
              .catch ((err) => {
              console.error("failed fetch " + err);
        
          }
          );
          return request;
      
      };
      
      const get_components = async () => {
              var list = fetch("https://umweltbundesamt.api.proxy.bund.dev/api/air_data/v3/components/json?lang=de&index=id")
              .then(response => response.json())
              .then(data => {
                  if (debug) console.log(data);
                  return data})
              .catch ((err) => {
              console.error("failed fetch " + err);
              
          }
          );
          return list;
      };
      
      async function get_data (station_code) {
          if (re_init) return;
          
         var data = await send_request(station_code);
      
         if (Object.keys(data.data).length == 0){
             let time_req = new Date();
              if (time_req.getHours() == 0 || time_req.getHours() == 1) console.log ('Keine Daten Empfangen (evtl. "Stunde 0" - BUG)');
              else console.log ('Keine Daten Empfangen');
              return;
          }
         
          else if (typeof components === 'undefined'){
              console.warn ("Keine components geladen => Neue Initialisierung in 15 Sekunden");
              clearSchedule(timer);
              re_init = true;
              re_init_timeout = setTimeout(function(){
                  re_init = false;
                  init();
              },15000);
      
              return;
          }
          else if (typeof stations_list === 'undefined'){
              console.warn ("Keine Stationsliste geladen => Neue Initialisierung in 15 Sekunden");
              re_init = true;
              re_init_timeout = setTimeout(function(){
                  re_init = false;
                  init();
              },15000);
              return;
          }
      
          if (!existsObject(dp_path + station_code)){
              if (debug) console.warn("not exist => " +  stations_list.data[data.request.station][2]);
              createBaseFolder(dp_path + station_code, "folder", stations_list.data[data.request.station][2]);
          }
          
          var measure_set = data.data[data.request.station][data.request.datetime_from];
      
          for (let i = 3 ; i < measure_set.length; i++) {
          
              var id = dp_path + station_code + "." + components[measure_set[i][0]][1];
              if (debug) console.log ("ID: " + id);
              
              // Roh-Wert anlegen/speichern
              existsState(id, (err, isExists) => {
                  var idwork = dp_path + station_code + "." + components[measure_set[i][0]][1];
                  if (debug){
                      console.log ("IDwork: " + idwork);
                      console.log ("initval: " + measure_set[i][1]);
                      console.log ("Name: " + components[measure_set[i][0]][4] + "(" + components[measure_set[i][0]][1] + ")");
                      console.log ("unit: " + components[measure_set[i][0]][3]);
                  }
                  if (err) console.error (err);
              
                  if (isExists) {
                      if (debug) console.log ("Exists writing new value");
                      setState(idwork,  measure_set[i][1], true);
                  }
              
                  else{
                      if (debug) console.log ("Not Exists - creating State");
                      createState(idwork, measure_set[i][1], { name: components[measure_set[i][0]][4] + " (" + components[measure_set[i][0]][2] + ")", unit: components[measure_set[i][0]][3], type: "number", role: "value", read: true, write: true} , () => { log('Dp '+ idwork + ' erstellt!'); });
                  }
              });
      
              // Qualitätsindex anlegen/speichern gerundet
              let id_index = id + "_index";
              existsState(id_index, (err, isExists) => {
                  let id_index_work = id_index;
                  if (debug){
                      console.log ("ID_index_work: " + id_index_work);
                      console.log ("initval: " + measure_set[i][2]);
                      console.log ("Name: Qualitätsindex " + components[measure_set[i][0]][4]);
                  }
      
                  if (err) console.error (err);
      
                  if (isExists) {
                      if (debug) console.log ("Exists writing new value");
                      setState(id_index_work,  measure_set[i][2], true);
                  }
              
                  else{
                      if (debug) console.log ("Not Exists - creating State");
                      createState(id_index_work, measure_set[i][2], { name: "Qualitätsindex " + components[measure_set[i][0]][4], type: "number", role: "indicator", read: true, write: true} , () => { log('Dp '+ id_index_work + ' erstellt!'); });
                  }
              });
      
              // Roh-Wert Qualitätsindex anlegen/speichern gerundet
              let id_index_val = id + "_index_val";
              existsState(id_index_val, (err, isExists) => {
                  let id_index_val_work = id_index_val;
                  if (debug){
                      console.log ("IDwork: " + id_index_val_work);
                      console.log ("initval: " + measure_set[i][3]);
                      console.log ("Name: Qualitätsindex (roh)" + components[measure_set[i][0]][4]);
                  }
      
                  if (err) console.error (err);
      
                  if (isExists) {
                      if (debug) console.log ("Exists writing new value");
                      setState(id_index_val_work,  parseFloat(measure_set[i][3]), true);
                  }
              
                  else{
                      if (debug) console.log ("Not Exists - creating State");
                      createState(id_index_val_work, parseFloat(measure_set[i][3]), { name: "Qualitätsindex " + components[measure_set[i][0]][4] + " (roh)", type: "number", role: "indicator", read: true, write: true} , () => { log('Dp '+ id_index_val_work + ' erstellt!'); });
                  }
      
              });
          }
      
          // timestamp
          let id_ts = dp_path + station_code + ".ts";
          existsState(id_ts, (err, isExists) => {
              let id_ts_work = id_ts;
              if (debug){
                  console.log ("IDwork: " + id_ts);
                  console.log ("initval: " + measure_set[0]);
              }
      
              if (err) console.error (err);
      
                  let ts = new Date(measure_set[0]+"Z");
                  let string_ts = ts.getDate()+ "." + (ts.getMonth()+1) + "." + ts.getFullYear() + " " + ts.getHours() + ":" + (ts.getMinutes() < 10 ? "0" + ts.getMinutes() : ts.getMinutes());
      
              if (isExists) {
                      if (debug) console.log ("Exists writing new value");
                      setState(id_ts_work,  string_ts, true);
              }
              else {
                  if (debug) console.log ("Not Exists - creating State");
            
                  createState(id_ts, string_ts, { name: "Ende der Messung", type: "string", role: "value", read: true, write: true} , () => { log('Dp '+ id_ts + ' erstellt!'); });
              }
          });
      
      }
      onStop (() => {
          clearSchedule(timer);
          clearTimeout(re_init_timeout);
      });
      
      async function init(){
          stations_list = await get_stations();
          components = await get_components();
          stations.forEach (get_data); // init für sofortige Datenverfügbarkeit
      }
      
      init();
      
      // timer um */10
      timer = schedule({minute: [10]}, () => {
          stations.forEach (get_data);
      });
      
      posted in Skripten / Logik
      Boronsbruder
      Boronsbruder
    • RE: [Linux Shell-Skript] WLAN-Wetterstation

      @SBorg
      FIX ist wahrscheinlich

      Zeile 1320 PREDP in PRE_DP ändern

      Richtig:

      --data 'from(bucket: "'${INFLUX_BUCKET}'") |> range(start: '${FLUXSTART}', stop: '${FLUXENDE}') |> filter(fn: (r) => r._measurement == "'${PRE_DP}'.Regen_Tag" and r._field == "value") |> aggregateWindow(every: 1d, fn: max) |> sum()')
      
       ./wetterstation.sh --metsommer
      
       Daten vom 01.06.2023 bis 31.08.2023 wurden ermittelt...
      
               Ø-Temperatur: 19.47 °C
               Regenmenge  : 0 l/m²
      
      
      posted in Praktische Anwendungen (Showcase)
      Boronsbruder
      Boronsbruder
    • RE: [Vorlage] Luftqualitätswerte abrufen

      @siggi0904

      v2.8 online
      Änderung => Daten werden mit ack=true gespeichert

      posted in Skripten / Logik
      Boronsbruder
      Boronsbruder
    • RE: VIS editor Sprache und Darstellung

      @skvarel
      Ich weiß, ich weiß... hab ich auch zu oft in meinen Skripts...
      Aber Lösung ist ja schon in Arbeit 👍

      posted in ioBroker Allgemein
      Boronsbruder
      Boronsbruder
    • RE: Test Adapter TrashSchedule

      Es gibt Probleme mit Version 0.0.7 (siehe hier)!

      Die Version setzt die Übersetzungen im Vis Editor ausser Kraft und die Überschriften zeigen nur noch die Systemnamen!

      Ein Issue wurde bei Git-Hub schon von einem User erstellt

      Edit:

      Die Version 0.0.8 wurde veröffentlicht! Dort ist der Fehler behoben!

      posted in Tester
      Boronsbruder
      Boronsbruder
    • RE: [Linux Shell-Skript] WLAN-Wetterstation

      @rene55
      Adapter kann ich nicht.
      Skripten ein bischen, deswegen hab ich für euch/uns Daten-Fetischisten mal mit nem Skript angefangen:

      // Luftqualität v1
      
      // User Einstellungen
      
      const stations = ["DEBW019"]; // Stationen, können durch Komma getrennt werden z.B. ["DEBW019", "DEBY007"]
      const datenpunkt_pre ="0_userdata.0" // => wird in 0_userdata.0.Luftqualität gespeichert
      const debug = false;
      //  Abfrage findet um **:05 und **:10 stündlich statt (um fehlende Daten eventl. nachzufüllen). Die Daten werden sowieso nur stündlich von der letzten Stunde zur Verfügung gestellt...
      
      // Datenverarbeitung 
      
      var dp_path = datenpunkt_pre + ".Luftqualität.";
      var timer;
      var components;
      var stations_list;
      
      const fetch = require('node-fetch');
      
      function createBaseFolder(ID, type, name)
      {
      /** geklaut bei grrfield
       * Erstellt Basisfolder und stellt den richtigen Typ ein
       * @param   {string}    ID          ID des Folders
       * @param   {any}       type        Typ des Folders
       * @param   {string}    [name]      (optional) Name des Folders
       */  
      
          createState(ID, function() {
              let obj=getObject(ID);
              obj.type=type;
              if(name != undefined) obj.common.name=name;
              obj.common.role='';
              setObject(ID, obj);
          });
      }
      
      const get_stations = async () => {
          const url_stations = "https://umweltbundesamt.api.proxy.bund.dev/api/air_data/v3/stations/json?lang=de";
          var stations_json = fetch(url_stations)
              .then(response => response.json())
              .then(data => {
                  //if (debug) console.log(data);
                  return data})
              .catch ((err) => {
              console.error("failed fetch " + err);
              
          }
          );
          return stations_json;
      }
      
      const send_request = async (station_code) => {
              const d = new Date();
      
      let hour = d.getHours()-1;
      let date = d.getFullYear + "-" + d.getMonth + "-" + d.getDay;
      
              const url_server = "https://umweltbundesamt.api.proxy.bund.dev/api/air_data/v3/airquality/json?date_from=" + date + "&time_from=" + hour + "&date_to=" +date +"&time_to=" + (hour +1) + " &station=" + station_code + "&lang=de";
              var request = fetch(url_server)
              .then(response => response.json())
              .then(data => {
                  if (debug) console.log(data);
                  return data})
              .catch ((err) => {
              console.error("failed fetch " + err);
        
          }
          );
          return request;
      
      };
      
      const get_components = async () => {
              var list = fetch("https://umweltbundesamt.api.proxy.bund.dev/api/air_data/v3/components/json?lang=de&index=id")
              .then(response => response.json())
              .then(data => {
                  if (debug) console.log(data);
                  return data})
              .catch ((err) => {
              console.error("failed fetch " + err);
              
          }
          );
          return list;
      };
      
      async function get_data (station_code) {
            
          var data = await send_request(station_code);
      
          if (!existsObject(dp_path + station_code)){
              if (debug) console.warn("not exist => " +  stations_list.data[data.request.station][2]);
              createBaseFolder(dp_path + station_code, "folder", stations_list.data[data.request.station][2]);
          }
          var measure_set = data.data[data.request.station][data.request.datetime_from];
          
          for (let i = 3 ; i < measure_set.length; i++) {
          
              var id = dp_path + station_code + "." + components[measure_set[i][0]][1];
              if (debug) console.log ("ID: " + id);
              existsState(id, (err, isExists) => {
                  var idwork = dp_path + station_code + "." + components[measure_set[i][0]][1];
                  if (debug){
                      console.log ("IDwork: " + idwork);
                      console.log ("initval: " + measure_set[i][1]);
                      console.log ("Name: " + components[measure_set[i][0]][4] + "(" + components[measure_set[i][0]][1] + ")");
                      console.log ("unit: " + components[measure_set[i][0]][3]);
                  }
                  if (err) console.error (err);
              
                  if (isExists) {
                      if (debug) console.log ("Exists writing new value");
                      setState(idwork,  measure_set[i][1]);
                  }
              
                  else{
                      if (debug) console.log ("Not Exists - creating State");
                      createState(idwork, measure_set[i][1], { name: components[measure_set[i][0]][4] + " (" + components[measure_set[i][0]][2] + ")", unit: components[measure_set[i][0]][3], type: "number", role: "value", read: true, write: true} , () => { log('Dp '+ idwork + ' erstellt!'); });
                  }
              });
          }
      }
      onStop (() => {
          clearSchedule(timer);
      });
      async function init(){
          stations_list = await get_stations();
          components = await get_components();
          stations.forEach (get_data); // init für sofortige Datenverfügbarkeit
      
          // timer um */5 und */10
          timer = schedule({minute: [5,10]}, () => {
          stations.forEach (get_data);
      });
      }
      
      init();
      

      Funktion:
      auf der SEITE des Umwelbundesamtes die StationsID raussuchen
      582e07dc-ceb1-4d47-8e50-73147c3d7d8b-grafik.png
      Es können auch mehrere Stationen durch Komma getrennt im Skript eingetragen werden.
      Dann werden die Daten (letzter Stündlicher Mittelwert) unter dem eingestellten Datenpunkt um **:05 und **:10 gespeichert.

      f026f669-f3ef-431f-a141-8cc9ae77705a-grafik.png

      Ich plane noch die "Airquality indexes" hinzuzufügen.

      posted in Praktische Anwendungen (Showcase)
      Boronsbruder
      Boronsbruder
    • RE: Test Adapter Husqvarna Automower v0.3.x

      @opossum @Kaschi68
      Das liegt daran, dass es 2 verschiedene Arten gibt, wie die Daten übertragen werden:

      1. Der Websocket:
        Hier wird eine Verbindung aufgebaut und er der Husqvarna-Server sendet die Paket mit den Daten an den Adapter.
        Daten wie z.B. die "Totals" sind hier nicht enthalten.
      2. Die Api:
        Die Daten müssen vom Adapter gehohlt werden und werden nicht geliefert.
        Hier sind die Daten wie die Totals enthalten, AAABER die Anzahl der möglichen Abrufe ist beschränkt.
      Limits
      
      The following limitations currently apply to the Automower® Connect API:
      
          Max 1 request per second and appKey.
          Max 10 000 request per month and appKey.
      
      Any additional requests above these limits will be throttled.
      

      Im Adapter von @ice987 werden, meines Wissens nach, die Daten beim Start per API abgerufen und dann mit den Daten, die der Websocket liefert, aktualisiert.

      Eine Möglichkeit wäre, dass @ice987 eine regelmäßige API-Abfrage einbaut. Die muss aber zeitlich beschränkt sein, da sie sonst zu einer Drosselung führt.

      Am besten auf GitHub eine Anfrage auf Erweiterung stellen?

      posted in Tester
      Boronsbruder
      Boronsbruder
    • RE: Meldungen seit controller v3.3 zu falschem Datentyp

      @apollon77 said in Meldungen seit controller v3.3 zu falschem Datentyp:

      @boronsbruder Warte noch paar Stunden, das Repo wird gerade verschoben. Dann bitte dort anlegen

      So hier der Issue

      https://github.com/iobroker-community-adapters/iobroker.kodi/issues/1

      ist aber nicht zu kodi.0.seek der ist ja schon gefixed.
      sondern zu:

      State value to set for "kodi.0.info.audio_channels" has to be type "number" but received type "string"
      State value to set for "kodi.0.info.audio_bitrate" has to be type "string" but received type "number"
      
      State value to set for "kodi.1.info.genre" has to be type "string" but received type "boolean"
      

      letzterer erscheint nur beim Adapter-Neustart

      Boronsbruder created this issue in iobroker-community-adapters/iobroker.kodi

      closed State Value -> Wrong Type #1

      posted in ioBroker Allgemein
      Boronsbruder
      Boronsbruder
    • RE: [Vorlage] Luftqualitätswerte abrufen

      Version 2.3 eingestellt

      // v2.2 - fix Clear Timeouts und Schedules beim Stoppen
      // v2.3 - fix Fehlerbearbeitung

      !!! Sollte das Skript vor den Fixes nicht mehr gestoppt werden können (tritt normalerweise nur bei einem Fehler beim Abrufen der Daten auf), dann bitte die Javascript-Instanz neustarten: Dann werden alle nicht gelöschten Timeouts gestoppt

      posted in Skripten / Logik
      Boronsbruder
      Boronsbruder

    Latest posts made by Boronsbruder

    • RE: Javascript "startSkript" startet Skript doppelt

      @ticaki
      Das weiß ich und hab ich auch.
      Das "Problem" bzw. die Frage ist warum das Skript doppelt startet 😉

      posted in Skripten / Logik
      Boronsbruder
      Boronsbruder
    • RE: Javascript "startSkript" startet Skript doppelt

      @asgothian

      Das ist das komplette Skript (mit der Debug-Zeile und dem "Fehler" mit nur runskript ohne Timeout

      //Definitionen
              const sDPFrost = '0_userdata.0.Wetter.aktuell.Frost';
              const aDP_Frost_Devices=['hm-rpc.0.00089D89BA198D.3.STATE','hm-rpc.0.00089D89A1686E.4.STATE','hm-rpc.0.00089F29B112F6.3.STATE']; //Pumpe Zisterne, Moorbeet, Teich => aus wenn Frost, weil Kanäle und-verknüpft
              const sDP_SensorIBC1 = 'hm-rpc.0.001F1A4990B273.1.STATE'; // Pegelschalter IBC voll
              
              const titel = "RaspMatic Reboot";
              var msg = 'Frost aktualisiert ' + '\n\r';
              
              
              // Trigger RaspMatic nach Reboot
              
              function sendMsg(pushmsg){
                      
                  sendTo("pushover", {
                      message:  pushmsg , // mandatory - your text message
                      title: titel, // optional - your message's title, otherwise your app's name is used
                      //sound: 'magic', // optional - the name of one of the sounds supported by device clients to override the user's default sound choice
                          // pushover, bike, bugle, cashregister, classical, cosmic, falling,
                          // gamelan, incoming, intermission, magic, mechanical, pianobar, siren,
                          // spacealarm, tugboat, alien, climb, persistent, echo, updown, none
                      priority: -1 // optional
                          // -1 to always send as a quiet notification,
                          // 1 to display as high-priority and bypass the user's quiet hours, or
                          // 2 to also require confirmation from the user
                  });
              };
              
              on ({id: 'hm-rega.0.950', change: 'lt'}, function(data){ //Variable "CCU im Reboot" von RaspMatic
                //  if (!data.state.val) // CCU nicht mehr im Reboot
                //  {
                    console.log(data);
                      var bFrost = getState(sDPFrost).val;
              
                      // Frost initialisieren
                      aDP_Frost_Devices.forEach (id => {
                          setState(id, !bFrost);
                          msg += '-- ' + id + ' : ' + !bFrost +'\n\r';
                      });
              
                      // IBC Pegel initialisieren
                      var bIBC_voll = getState(sDP_SensorIBC1).val;
                      setState('0_userdata.0.Bewässerung.IBC.Pegel_voll', bIBC_voll);
                          msg += ' -- IBC Pegel voll : ' + bIBC_voll + '\n\r';
                      
                      //Bewässerung reinit => Ventil-Steuerung-Skript neutstarten
                      stopScript('common.Bewässerung.Ventil_Steuerung', () => {
                          //setTimeout( ()=> {runScript('common.Bewässerung.Ventil_Steuerung')},1000);
                          runScript('common.Bewässerung.Ventil_Steuerung');
                      });
                      
                          msg += ' -- Reinit Venti-Überwachung \n\r';
              
                      // Info über Boot loggen
                      console.warn ("[Raspimatic-Boot] " + msg);
                      sendMsg(msg);
                      
              
                 // }
              });
      

      Es gibt nur eine Ausgabe ->

      EventObj {
        id: 'hm-rega.0.950',
        newState: {
          val: false,
          ts: 1757669894412,
          ack: false,
          lc: 1757669894412,
          from: 'system.adapter.admin.0',
          q: 0,
          c: undefined,
          user: 'system.user.admin'
        },
        oldState: {
          val: true,
          ts: 1757669892106,
          ack: true,
          lc: 1757669888017,
          from: 'system.adapter.hm-rega.0',
          q: 0,
          c: undefined,
          user: 'system.user.admin'
        },
        state: {
          val: false,
          ts: 1757669894412,
          ack: false,
          lc: 1757669894412,
          from: 'system.adapter.admin.0',
          q: 0,
          c: undefined,
          user: 'system.user.admin'
        }
      }
      

      aber das Skript startet wieder 2x:

      javascript.0	2025-09-12 11:38:15.492	info	Start JavaScript script.js.common.Bewässerung.Ventil_Steuerung (Javascript/js)
      javascript.0	2025-09-12 11:38:14.589	info	Start JavaScript script.js.common.Bewässerung.Ventil_Steuerung (Javascript/js)
      

      Und beide gestartet Skripts laufen dann parallel weiter...

      posted in Skripten / Logik
      Boronsbruder
      Boronsbruder
    • RE: Javascript "startSkript" startet Skript doppelt

      Also, das mit change: 'lt' hab ich mal präventiv getestet. (@Asgothian du meintest sicher: triggert von TRUE auf FALSE - nur um keine Fehler reinzubringen)
      Die Sache ist die, es wird immer nur das startSkript doppelt ausgeführt. Die anderen Teile sendMsg und der ConsolenOutput werden korrekt einmal ausgeführt.

      Die Lösung ist folgende:

              stopScript('common.Bewässerung.Ventil_Steuerung', () => {
                  setTimeout( ()=> {runScript('common.Bewässerung.Ventil_Steuerung')},1000);
              });
      

      Selbst ohne den Timeout also mit

               stopScript('common.Bewässerung.Ventil_Steuerung', () => {
                  runScript('common.Bewässerung.Ventil_Steuerung');
              });
      

      startet das Skript doppelt!
      Warum? Ich hab keine Ahnung...

      posted in Skripten / Logik
      Boronsbruder
      Boronsbruder
    • Javascript "startSkript" startet Skript doppelt

      Ich habe einen Trigger in einem Überwachungsskript das, nach dem die CCU gebootet hat, bestimmte Datenpunkte aktualisieren soll.
      Dieses Skript soll auch ein Skript neustarten, welches die Ventile meine Bewässerungsanlage steuert.

      Jetzt habe ich folgendes Problem:
      Es wird das Skript immer doppelt gestartet.

      on ({id: 'hm-rega.0.950', change: 'ne'}, function(data){ //Variable "CCU im Reboot" von RaspMatic
          if (!data.state.val) // CCU nicht mehr im Reboot
          {
              var bFrost = getState(sDPFrost).val;
      
              // Frost initialisieren
              aDP_Frost_Devices.forEach (id => {
                  setState(id, !bFrost);
                  msg += '-- ' + id + ' : ' + !bFrost +'\n\r';
              });
      
              // IBC Pegel initialisieren
              var bIBC_voll = getState(sDP_SensorIBC1).val;
              setState('0_userdata.0.Bewässerung.IBC.Pegel_voll', bIBC_voll);
                  msg += ' -- IBC Pegel voll : ' + bIBC_voll + '\n\r';
              
              //Bewässerung reinit => Ventil-Steuerung-Skript neutstarten
              
              startScript('common.Bewässerung.Ventil_Steuerung', false);
                  msg += ' -- Reinit Venti-Überwachung \n\r';
      
              // Info über Boot loggen
              console.warn ("[Raspimatic-Boot] " + msg);
              sendMsg(msg);
              
      
          }
      });
      
      javascript.0  2025-09-07 17:24:31.109	info	Start JavaScript script.js.common.Bewässerung.Ventil_Steuerung
      javascript.0  2025-09-07 17:24:32.049	info	Start JavaScript script.js.common.Bewässerung.Ventil_Steuerung
      

      mit dem "false"-Flag sollte das Skript ja eigentlich neugestartet werden, wenn es läuft, oder?

      Ich hatte auch schon einen "console.log" eingebaut. Der Teil wird nur 1x ausgelöst.

      Was übersehe ich?

      posted in Skripten / Logik
      Boronsbruder
      Boronsbruder
    • RE: Neuer Robonect HX Adapter

      @iobrokermike
      Hmm, ich seh da auch nichts, was die Timeouts auslösen könnte...

      posted in ioBroker Allgemein
      Boronsbruder
      Boronsbruder
    • RE: Neuer Robonect HX Adapter

      @iobrokermike
      kannst du mal die Einstellungen deiner Instanz posten?
      Ich habe zum Beispiel
      ad984793-cd8a-4d1e-966c-1fe75ff2808e-grafik.png
      aktiviert.
      Evtl. verhindert das Timeouts?

      Achja, führt bei mir aber immer mal wieder zu

      	warn	No connection to lawn mower (Not able to ping it). Check network connection.
      

      Einträgen, was aber wahrscheinlich an meinem Setup mit einer WLAN-Brücke liegt

      posted in ioBroker Allgemein
      Boronsbruder
      Boronsbruder
    • RE: [Linux Shell-Skript] WLAN-Wetterstation

      @quinti
      Welche InfluxDB Version benutzt du?
      benötigt logging per InfluxDB V2.x + Aktivierung in der wetterstation.conf

      posted in Praktische Anwendungen (Showcase)
      Boronsbruder
      Boronsbruder
    • RE: [Linux Shell-Skript] WLAN-Wetterstation

      @shakira1972
      probier doch mal die angehängte
      wetterstation.sub

      Es waren 2 Tippfehler drin

      @SBorg Kauf dir mal ne neue Brille 🤣 P.S.: Hab dir ein Issue auf Github gemacht

      posted in Praktische Anwendungen (Showcase)
      Boronsbruder
      Boronsbruder
    • RE: [Linux Shell-Skript] WLAN-Wetterstation

      @shakira1972
      Da haben wir den Fehler:
      Die SimpleAPI-Instanz des Iobroker ist nicht unter 192.168.1.3 auf Port 8087 erreichbar

      posted in Praktische Anwendungen (Showcase)
      Boronsbruder
      Boronsbruder
    • RE: [Linux Shell-Skript] WLAN-Wetterstation

      @shakira1972
      Was sagt denn ? (Bei gestopptem Dienst)

      ./wetterstation.sh --debug
      
      posted in Praktische Anwendungen (Showcase)
      Boronsbruder
      Boronsbruder
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo