Navigation

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

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Profile
    • Following 0
    • Followers 0
    • Topics 11
    • Posts 357
    • Best 54
    • Groups 2

    Boronsbruder

    @Boronsbruder

    68
    Reputation
    79
    Profile views
    357
    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: [Linux Shell-Skript] WLAN-Wetterstation

      @negalein
      Reines Gateway und lieber dazu ein Tablet mit einer schönen Vis oder Grafana 😉
      Ich hab hier das GW2000 (Lan und Wifi) und ein GW1100 (nur Wlan - ist nur für meine Bewässerung) am laufen.
      Zur Stabilität bei Stromausfall kann ich nix sagen da das GW2000 über ein POE-Splitter am Switch mit USV hängt.

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

      @oliver1972
      @sborg meinte die Kommandozeile ./wetterstation.sh --data ausführen und die Ausgabe der Sensoren, ohne den ganzen Krismkrams darum, posten:
      Hier Feuchte-Sensor 1-5:

      ->  soilmoisture1=30&soilad1=185&soilmoisture2=55&soilad2=230&soilmoisture4=11&soilad4=114&soilmoisture5=40&soilad5=224
      

      Achja vor der Ausführung den Dienst stoppen (systemctl stop wetterstation.service)

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

      @negalein
      Ich hab die Ausseneinheit Froggit WH4000SE an nem GW2000 am laufen. Sollte also auch am 3000er gehen.
      e390054f-0a69-4d61-b3a8-02edf53f6cf9-grafik.png

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

      @martybr
      Das ist richtig. Ich gehe nur her und vergebe dann für die Anzeige Name und deaktiviere alle freien Slots, dass dort nicht immer nach neuen Geräte gesucht wird.
      6adc2e48-f4fb-45fb-8f76-699ac47c7c32-grafik.png
      dcca1b1b-56c6-45e6-add7-89edb4e38c03-grafik.png
      Nur zum Nachrüsten von neuen Geräten aktiviere ich die Kanäle
      Ach ja, ich weiß nicht wie es beim 3000er ist, aber beim 2000er muss man die Regenzeit unter Rain-Totals einstellen. Steht standardmäßig nicht auf Januar und dann wird die Jahresmenge nicht richtig zurückgesetzt:
      874e62a1-4c15-47f3-b6a8-306bd3f608dd-grafik.png

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

      @negalein
      ist quasi der große Bruder vom GW2000 mit externer Antenne und glaube ich sogar ne SD-Karte ist möglich und in der Regel funktioneren alle Geräte der älteren Gateways.
      Zumindest hat der Umstieg bzw. im Moment der Parallelbetrieb des gw1000 und gw2000 ohne Probleme funktionert.
      Das GW1000 empfängt nur die Bodenfeuchte-Sensoren für die Steuerung meiner Bewässerung (und die Aussentemperatur weil sonst das Skript von @SBorg zickt :D)
      So kannst übrigens auch nen Testlauf wegen Empfang machen. Einfach alle Sensoren in die neue Station einpflegen und dann die alte später abschalten.

      Gw3000 Daten im Ecowitt-Shop

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

      @rand
      Meines Wissens sagte @Sborg irgendwann "Mein Skript schreibt nichts in die InfluxDB"
      Du musst die Objekte selbst mitschreiben.

      Zitat aus der Installationsanleitung "Wetterstation-Statistik":

      Voraussetzung: laufendes WLAN-Wetterstation Shellscript, laufender Javascript- und InfluxDB-Adapter im ioBroker, aktiviertes logging per InfluxDB der drei benötigten Datenpunkte "Aussentemperatur", "Wind_max" und "Regen_Tag" (falls diese noch nicht für Grafana oä. schon geloggt werden)
      
      posted in Praktische Anwendungen (Showcase)
      Boronsbruder
      Boronsbruder
    • RE: [Linux Shell-Skript] WLAN-Wetterstation

      @Rand
      Schau mal in die logs der Influxdb -> Doku V1 -> Doku V2

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

      @stefanw
      Die sendeintervalle sind auch gleich eingestellt?

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

      Die Fehlermeldung heisst eigentlich nur, dass der 'hm.rega'-Adapter, die erneute Abfrage ignoriert, da die alte Abfrage noch aussteht.

      Zum Eintrag in der wetterstation.conf sagt die Anleitung:

      WS_POLL: Abfrageintervall der Wetterstation. Hier ist der Wert aus der WS View App zu übernehmen (Punkt 8 der Einstellungen)
      

      Also App 60s folglich ws_poll 60s oder App 30s und ws_poll 30s wenn es kürzer sein soll.

      Wahrscheinlich ist ein fehlerhaftes Blockly der Auslöser.

      Ich kenne mich ja mit Blockly gar nicht aus, aber "binde object" sieht für mich falsch aus.
      Eigentlich soll ja nur der Wert (value) aus dem einen Object ins andere geschrieben werden?

      Alternativ kannst du das JS-Script mal probieren.

      on  ({id:'ID Datenpunkt WETTERSTATION WIND', change:'ne'}, function (data){
          setState('hm-rega.0.70895', data.state.val);
      });
      

      Nur die ID des Wetterstation-Wind-Datenpunktes einsetzen.
      Es wird bei Änderung des Datenpunktes der Wert in 70895 geschrieben

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

      Falls es jemand interessiert => Es gibt einen neuen Wert der sowohl von GW2000 als auch vom GW3000 übertragen wird:
      VPD

      vpd=0.309
      

      Näheres steht auch im Wetterstationsforum
      Da geht es um die Wassser-Sättigung in der Luft.
      In dem Thread wird auch über die Berechnung und den Hintergrund geplauscht 😉

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