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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Praktische Anwendungen (Showcase)
  4. [Linux Shell-Skript] WLAN-Wetterstation

NEWS

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

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

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

[Linux Shell-Skript] WLAN-Wetterstation

Geplant Angeheftet Gesperrt Verschoben Praktische Anwendungen (Showcase)
linuxshell-scriptwetterstationwlan-wetterstation
5.7k Beiträge 153 Kommentatoren 3.8m Aufrufe 135 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • Rene55R Online
    Rene55R Online
    Rene55
    schrieb am zuletzt editiert von Rene55
    #5152

    @sborg Besten Dank. Auch dafür, dass du das .json veröffentlicht hast. Vorweg: das alte Dashboard mit Influx1 habe ich derzeit auch noch laufen. Aber ich möchte den alten Ballast mal abwerfen. Ja konkret Ozon bekomme ich jetzt wahrscheinlich hin. Stimmt auch "Temperatur in 3 Stunden" fehlt (oder würde mir fehlen). Dann habe ich genau unter UV Index ein Panel, in dem keine Abfrage drin ist. OK, könnte ich löschen. Der größte Missstand ist der, dass ich z.B beim Regen dieses sehe:

    Wetter_Panel-Regen.png

    Ich denke, ich hab da auch noch ein grundlegendes Problem mit Mehrfachdaten.

    Host: Fujitsu Intel(R) Pentium(R) CPU G4560T, 32 GB RAM, Proxmox 8.x + lxc Ubuntu 22.04
    ioBroker (8 GB RAM) Node.js: 20.19.1, NPM: 10.8.2, js-Controller: 7.0.6, Admin: 7.6.3
    Wetterstation: Froggit WH3000SE V1.6.6

    SBorgS 1 Antwort Letzte Antwort
    0
    • NegaleinN Negalein

      @sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:

      Also schmeiße ich die per Task (glaube 7 Tage) kpl. aus der DB raus

      kannst du das genauer erklären?

      Hab mir dazu schon öfter was im Netz gesucht. Aber so richtig schlau, wie wo was konfiguriert werden muss, hab ich nichts vernünftiges gefunden.

      SBorgS Offline
      SBorgS Offline
      SBorg
      Forum Testing Most Active
      schrieb am zuletzt editiert von
      #5153

      @negalein sagte in [Linux Shell-Skript] WLAN-Wetterstation:

      @sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:

      Also schmeiße ich die per Task (glaube 7 Tage) kpl. aus der DB raus

      kannst du das genauer erklären?

      Hab mir dazu schon öfter was im Netz gesucht. Aber so richtig schlau, wie wo was konfiguriert werden muss, hab ich nichts vernünftiges gefunden.

      + @Rene55

      Da wirst du so auch nichts "gutes" finden, denn Flux beherrscht kein "drop" von Datenreihen. Mit einem einfachen Task ist da nichts zu machen. Meine Lösung war (ich nutze sie auch nicht mehr) weder richtig praktikabel, geschweige denn massentauglich. Das war auslagern der gewünschten Daten, kpl. Reihe droppen und die ausgelagerte wieder importieren.
      Sehr, sehr System lastig und durch den Im- und Export gehen auch definitiv Daten verloren, da alles was in dem Zeitraum Export - droppen - Import in die InfluxDB an neuen Daten geschrieben wird geht unweigerlich den Weg ins Nirvana.

      Aus Zeitmangel speichere ich aktuell einfach alles. Mein NAS hat im Moment 20TB, da ist noch Platz (auch für zusätzliche HDDs).
      Der Zukunftsplan sieht dann aggregieren vor wo es Sinn macht (Temperatur genügt IMO alle 15 Minuten ein Messwert) und leider per Bash-Skript und Cronjob dann droppen der nicht benötigten Daten per Influx-CLI. Eine andere praktikable Lösung sehe ich aktuell nicht. Das Hauptproblem dabei ist, man kann halt nicht das aktuelle Bucket bearbeiten. Man muss immer alles in ein anderes Bucket schreiben. Verweist man bei Grafana auf das "neue" Bucket fehlen aktuelle Daten (außer man lässt den Task alle x Minuten laufen), nimmt man das "aktuelle" Bucket muss man die Daten in diesem auch zumindest für 365 Tage vorhalten :(

      LG SBorg ( SBorg auf GitHub)
      Projekte: Lebensmittelwarnung.de | WLAN-Wetterstation | PimpMyStation

      Rene55R 1 Antwort Letzte Antwort
      0
      • SBorgS SBorg

        @negalein sagte in [Linux Shell-Skript] WLAN-Wetterstation:

        @sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:

        Also schmeiße ich die per Task (glaube 7 Tage) kpl. aus der DB raus

        kannst du das genauer erklären?

        Hab mir dazu schon öfter was im Netz gesucht. Aber so richtig schlau, wie wo was konfiguriert werden muss, hab ich nichts vernünftiges gefunden.

        + @Rene55

        Da wirst du so auch nichts "gutes" finden, denn Flux beherrscht kein "drop" von Datenreihen. Mit einem einfachen Task ist da nichts zu machen. Meine Lösung war (ich nutze sie auch nicht mehr) weder richtig praktikabel, geschweige denn massentauglich. Das war auslagern der gewünschten Daten, kpl. Reihe droppen und die ausgelagerte wieder importieren.
        Sehr, sehr System lastig und durch den Im- und Export gehen auch definitiv Daten verloren, da alles was in dem Zeitraum Export - droppen - Import in die InfluxDB an neuen Daten geschrieben wird geht unweigerlich den Weg ins Nirvana.

        Aus Zeitmangel speichere ich aktuell einfach alles. Mein NAS hat im Moment 20TB, da ist noch Platz (auch für zusätzliche HDDs).
        Der Zukunftsplan sieht dann aggregieren vor wo es Sinn macht (Temperatur genügt IMO alle 15 Minuten ein Messwert) und leider per Bash-Skript und Cronjob dann droppen der nicht benötigten Daten per Influx-CLI. Eine andere praktikable Lösung sehe ich aktuell nicht. Das Hauptproblem dabei ist, man kann halt nicht das aktuelle Bucket bearbeiten. Man muss immer alles in ein anderes Bucket schreiben. Verweist man bei Grafana auf das "neue" Bucket fehlen aktuelle Daten (außer man lässt den Task alle x Minuten laufen), nimmt man das "aktuelle" Bucket muss man die Daten in diesem auch zumindest für 365 Tage vorhalten :(

        Rene55R Online
        Rene55R Online
        Rene55
        schrieb am zuletzt editiert von
        #5154

        @sborg Das hört sich für mich gerade so an, als ob das aufspalten in long/short eigentlich gar nichts bringt.
        Ergo: speichern bis die Platte voll ist; ja oder bis kurz davor, damit man noch was retten kann. Oder einen Fummel schreiben, der aus dem Datenwust, irgendetwas komprimiertes macht. Noch keine Ahnung, was das sein könnte.

        Host: Fujitsu Intel(R) Pentium(R) CPU G4560T, 32 GB RAM, Proxmox 8.x + lxc Ubuntu 22.04
        ioBroker (8 GB RAM) Node.js: 20.19.1, NPM: 10.8.2, js-Controller: 7.0.6, Admin: 7.6.3
        Wetterstation: Froggit WH3000SE V1.6.6

        1 Antwort Letzte Antwort
        0
        • Rene55R Rene55

          @sborg Besten Dank. Auch dafür, dass du das .json veröffentlicht hast. Vorweg: das alte Dashboard mit Influx1 habe ich derzeit auch noch laufen. Aber ich möchte den alten Ballast mal abwerfen. Ja konkret Ozon bekomme ich jetzt wahrscheinlich hin. Stimmt auch "Temperatur in 3 Stunden" fehlt (oder würde mir fehlen). Dann habe ich genau unter UV Index ein Panel, in dem keine Abfrage drin ist. OK, könnte ich löschen. Der größte Missstand ist der, dass ich z.B beim Regen dieses sehe:

          Wetter_Panel-Regen.png

          Ich denke, ich hab da auch noch ein grundlegendes Problem mit Mehrfachdaten.

          SBorgS Offline
          SBorgS Offline
          SBorg
          Forum Testing Most Active
          schrieb am zuletzt editiert von
          #5155

          @rene55
          Jupp, da fehlt wohl bisserl was beim Regen. Irgendwie finde ich im neuen Grafana gerade nicht den JSON-Export für ein Panel...
          Hier ist mal mein JSON, allerdings müsstest du da überall die "uid": "ssI1YtJ4z" durch die UID deiner InfluxDB vor dem Import ersetzen.

          {
           "datasource": {
             "uid": "000000001",
             "type": "influxdb"
           },
           "fieldConfig": {
             "defaults": {
               "custom": {
                 "align": "left",
                 "cellOptions": {
                   "type": "auto"
                 },
                 "inspect": false,
                 "filterable": false
               },
               "mappings": [],
               "thresholds": {
                 "mode": "absolute",
                 "steps": [
                   {
                     "color": "green",
                     "value": null
                   }
                 ]
               },
               "color": {
                 "mode": "thresholds"
               },
               "decimals": 1,
               "displayName": "${__field.name}"
             },
             "overrides": [
               {
                 "matcher": {
                   "id": "byName",
                   "options": "Field"
                 },
                 "properties": [
                   {
                     "id": "displayName",
                     "value": "Zeitraum"
                   },
                   {
                     "id": "custom.align",
                     "value": "left"
                   }
                 ]
               },
               {
                 "matcher": {
                   "id": "byName",
                   "options": "Last"
                 },
                 "properties": [
                   {
                     "id": "displayName",
                     "value": "Regenmenge"
                   },
                   {
                     "id": "custom.align",
                     "value": "left"
                   },
                   {
                     "id": "decimals",
                     "value": 1
                   },
                   {
                     "id": "unit",
                     "value": "mm"
                   }
                 ]
               }
             ]
           },
           "gridPos": {
             "h": 7,
             "w": 5,
             "x": 9,
             "y": 12
           },
           "id": 79,
           "options": {
             "showHeader": true,
             "cellHeight": "sm",
             "footer": {
               "show": false,
               "reducer": [
                 "sum"
               ],
               "countRows": false,
               "fields": "",
               "enablePagination": false
             }
           },
           "pluginVersion": "10.2.3",
           "targets": [
             {
               "datasource": {
                 "type": "influxdb",
                 "uid": "ssI1YtJ4z"
               },
               "alias": "☂️ Heute",
               "groupBy": [
                 {
                   "params": [
                     "$__interval"
                   ],
                   "type": "time"
                 },
                 {
                   "params": [
                     "none"
                   ],
                   "type": "fill"
                 }
               ],
               "hide": false,
               "measurement": "0_userdata.0.Wetterstation.Regen_Tag",
               "orderByTime": "ASC",
               "policy": "default",
               "query": " from(bucket: \"${DatenBucket}\")\r\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n  |> filter(fn: (r) => r._measurement == \"${Data_Prefix}.${Data_Instanz}.Statistik.Wetter.VorTag.Regenmenge\" and r._field == \"value\")\r\n  |> set(key: \"_field\", value: \"☂️ Gestern\")\r\n  |> yield(name: \"Gestern\")\r\n  ",
               "refId": "B",
               "resultFormat": "time_series",
               "select": [
                 [
                   {
                     "params": [
                       "value"
                     ],
                     "type": "field"
                   },
                   {
                     "params": [],
                     "type": "last"
                   }
                 ]
               ],
               "tags": []
             },
             {
               "datasource": {
                 "type": "influxdb",
                 "uid": "ssI1YtJ4z"
               },
               "alias": "☂️ Heute",
               "groupBy": [
                 {
                   "params": [
                     "$__interval"
                   ],
                   "type": "time"
                 },
                 {
                   "params": [
                     "none"
                   ],
                   "type": "fill"
                 }
               ],
               "hide": false,
               "measurement": "0_userdata.0.Wetterstation.Regen_Tag",
               "orderByTime": "ASC",
               "policy": "default",
               "query": " from(bucket: \"${DatenBucket}\")\r\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n  |> filter(fn: (r) => r._measurement == \"${Data_Prefix}.${Data_Instanz}.${Data_Ordnername}.Regen_Tag\" and r._field == \"value\")\r\n  |> set(key: \"_field\", value: \"☂️ Heute\")\r\n  |> yield(name: \"Heute\")\r\n\r\n  ",
               "refId": "C",
               "resultFormat": "time_series",
               "select": [
                 [
                   {
                     "params": [
                       "value"
                     ],
                     "type": "field"
                   },
                   {
                     "params": [],
                     "type": "last"
                   }
                 ]
               ],
               "tags": []
             },
             {
               "datasource": {
                 "type": "influxdb",
                 "uid": "ssI1YtJ4z"
               },
               "alias": "☂️ Heute",
               "groupBy": [
                 {
                   "params": [
                     "$__interval"
                   ],
                   "type": "time"
                 },
                 {
                   "params": [
                     "none"
                   ],
                   "type": "fill"
                 }
               ],
               "hide": false,
               "measurement": "0_userdata.0.Wetterstation.Regen_Tag",
               "orderByTime": "ASC",
               "policy": "default",
               "query": " from(bucket: \"${DatenBucket}\")\r\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n  |> filter(fn: (r) => r._measurement == \"${Data_Prefix}.${Data_Instanz}.${Data_Ordnername}.Regen_Woche\" and r._field == \"value\")\r\n  |> set(key: \"_field\", value: \"☂️ aktuelle Woche\")\r\n  |> yield(name: \"aktuelle Woche\")\r\n\r\n  ",
               "refId": "D",
               "resultFormat": "time_series",
               "select": [
                 [
                   {
                     "params": [
                       "value"
                     ],
                     "type": "field"
                   },
                   {
                     "params": [],
                     "type": "last"
                   }
                 ]
               ],
               "tags": []
             },
             {
               "datasource": {
                 "type": "influxdb",
                 "uid": "ssI1YtJ4z"
               },
               "alias": "☂️ Heute",
               "groupBy": [
                 {
                   "params": [
                     "$__interval"
                   ],
                   "type": "time"
                 },
                 {
                   "params": [
                     "none"
                   ],
                   "type": "fill"
                 }
               ],
               "hide": false,
               "measurement": "0_userdata.0.Wetterstation.Regen_Tag",
               "orderByTime": "ASC",
               "policy": "default",
               "query": " from(bucket: \"${DatenBucket}\")\r\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n  |> filter(fn: (r) => r._measurement == \"${Data_Prefix}.${Data_Instanz}.${Data_Ordnername}.Regen_Monat\" and r._field == \"value\")\r\n  |> set(key: \"_field\", value: \"☂️ aktueller Monat\")\r\n  |> yield(name: \"aktueller Monat\")\r\n\r\n  ",
               "refId": "E",
               "resultFormat": "time_series",
               "select": [
                 [
                   {
                     "params": [
                       "value"
                     ],
                     "type": "field"
                   },
                   {
                     "params": [],
                     "type": "last"
                   }
                 ]
               ],
               "tags": []
             },
             {
               "datasource": {
                 "type": "influxdb",
                 "uid": "ssI1YtJ4z"
               },
               "alias": "☂️ Heute",
               "groupBy": [
                 {
                   "params": [
                     "$__interval"
                   ],
                   "type": "time"
                 },
                 {
                   "params": [
                     "none"
                   ],
                   "type": "fill"
                 }
               ],
               "hide": false,
               "measurement": "0_userdata.0.Wetterstation.Regen_Tag",
               "orderByTime": "ASC",
               "policy": "default",
               "query": " from(bucket: \"${DatenBucket}\")\r\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n  |> filter(fn: (r) => r._measurement == \"${Data_Prefix}.${Data_Instanz}.${Data_Ordnername}.Regen_Jahr_kumuliert\" and r._field == \"value\")\r\n  |> set(key: \"_field\", value: \"☂️ aktuelles Jahr\")\r\n  |> yield(name: \"aktuelles Jahr\")\r\n\r\n  ",
               "refId": "F",
               "resultFormat": "time_series",
               "select": [
                 [
                   {
                     "params": [
                       "value"
                     ],
                     "type": "field"
                   },
                   {
                     "params": [],
                     "type": "last"
                   }
                 ]
               ],
               "tags": []
             },
             {
               "datasource": {
                 "type": "influxdb",
                 "uid": "ssI1YtJ4z"
               },
               "alias": "☂️ Heute",
               "groupBy": [
                 {
                   "params": [
                     "$__interval"
                   ],
                   "type": "time"
                 },
                 {
                   "params": [
                     "none"
                   ],
                   "type": "fill"
                 }
               ],
               "hide": false,
               "measurement": "0_userdata.0.Wetterstation.Regen_Tag",
               "orderByTime": "ASC",
               "policy": "default",
               "query": " from(bucket: \"${DatenBucket}\")\r\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n  |> filter(fn: (r) => r._measurement == \"${Data_Prefix}.${Data_Instanz}.${Data_Ordnername}.Info.Regenmenge_VorJahr\" and r._field == \"value\")\r\n  |> set(key: \"_field\", value: \"☂️ VorJahr\")\r\n  |> yield(name: \"VorJahr\")\r\n\r\n  ",
               "refId": "G",
               "resultFormat": "time_series",
               "select": [
                 [
                   {
                     "params": [
                       "value"
                     ],
                     "type": "field"
                   },
                   {
                     "params": [],
                     "type": "last"
                   }
                 ]
               ],
               "tags": []
             }
           ],
           "transformations": [
             {
               "id": "reduce",
               "options": {
                 "includeTimeField": false,
                 "labelsToFields": true,
                 "mode": "seriesToRows",
                 "reducers": [
                   "last"
                 ]
               }
             }
           ],
           "transparent": true,
           "type": "table",
           "description": ""
          }
          


          Temperatur in 3h geht über den Adapter "Das Wetter" und ein kleines JS:

          
          const idTemp = '0_userdata.0.Data.Temperatur_in_3h';
          if (!existsState(idTemp)) { createState(idTemp, 0, { name: "erwartete Aussentemperatur in 3 Stunden", type: "number", role: "state", unit: "°C" }); }
          
          schedule('2 * * * *', function () {
             let hours3 = new Date().getHours() + 3;
             let id = 'daswetter.0.NextHours.Location_1.Day_1.Hour_' + hours3 + '.temp_value';
          
             if(hours3 > 24) { 
                hours3 -= 24;
                id = 'daswetter.0.NextHours.Location_1.Day_2.Hour_' + hours3 + '.temp_value';
              }
          
              setState(idTemp, getState(id).val, true);
          });
          
          

          Das leere Panel unter UV-Index existiert bei mir nicht mehr, aber das könnte das Panel für das "Boom-Theme" sein. Das ist eigentlich auf unsichtbar gestellt, darüber kann man aber das Hintergrundbild auswählen.


          Mit dem long/short bin ich noch unschlüssig. Eine Idee wäre in ein "Tages-Bucket" zu schreiben. Hierauf würden dann aktuelle Werte von Grafana (short) verweisen. Per Tasks wird dann alles kopiert, aggregiert und ins long geshifftet. Hierauf verweist dann Grafana auf alles was eben nicht "heute" ist (zB. Temperaturgraf der letzten 365 Tage).
          Die Retention für dieses "Tages-Bucket" könnte dann bspw. 5 Tage sein, sprich alles älter als 5 Tage wird automatisch aus diesem Bucket gelöscht. Deswegen ist die Idee mit mehreren Buckets nicht abwegig, da man pro Bucket die Retention wählen kann ;)

          LG SBorg ( SBorg auf GitHub)
          Projekte: Lebensmittelwarnung.de | WLAN-Wetterstation | PimpMyStation

          Rene55R 1 Antwort Letzte Antwort
          1
          • SBorgS SBorg

            @rene55
            Jupp, da fehlt wohl bisserl was beim Regen. Irgendwie finde ich im neuen Grafana gerade nicht den JSON-Export für ein Panel...
            Hier ist mal mein JSON, allerdings müsstest du da überall die "uid": "ssI1YtJ4z" durch die UID deiner InfluxDB vor dem Import ersetzen.

            {
             "datasource": {
               "uid": "000000001",
               "type": "influxdb"
             },
             "fieldConfig": {
               "defaults": {
                 "custom": {
                   "align": "left",
                   "cellOptions": {
                     "type": "auto"
                   },
                   "inspect": false,
                   "filterable": false
                 },
                 "mappings": [],
                 "thresholds": {
                   "mode": "absolute",
                   "steps": [
                     {
                       "color": "green",
                       "value": null
                     }
                   ]
                 },
                 "color": {
                   "mode": "thresholds"
                 },
                 "decimals": 1,
                 "displayName": "${__field.name}"
               },
               "overrides": [
                 {
                   "matcher": {
                     "id": "byName",
                     "options": "Field"
                   },
                   "properties": [
                     {
                       "id": "displayName",
                       "value": "Zeitraum"
                     },
                     {
                       "id": "custom.align",
                       "value": "left"
                     }
                   ]
                 },
                 {
                   "matcher": {
                     "id": "byName",
                     "options": "Last"
                   },
                   "properties": [
                     {
                       "id": "displayName",
                       "value": "Regenmenge"
                     },
                     {
                       "id": "custom.align",
                       "value": "left"
                     },
                     {
                       "id": "decimals",
                       "value": 1
                     },
                     {
                       "id": "unit",
                       "value": "mm"
                     }
                   ]
                 }
               ]
             },
             "gridPos": {
               "h": 7,
               "w": 5,
               "x": 9,
               "y": 12
             },
             "id": 79,
             "options": {
               "showHeader": true,
               "cellHeight": "sm",
               "footer": {
                 "show": false,
                 "reducer": [
                   "sum"
                 ],
                 "countRows": false,
                 "fields": "",
                 "enablePagination": false
               }
             },
             "pluginVersion": "10.2.3",
             "targets": [
               {
                 "datasource": {
                   "type": "influxdb",
                   "uid": "ssI1YtJ4z"
                 },
                 "alias": "☂️ Heute",
                 "groupBy": [
                   {
                     "params": [
                       "$__interval"
                     ],
                     "type": "time"
                   },
                   {
                     "params": [
                       "none"
                     ],
                     "type": "fill"
                   }
                 ],
                 "hide": false,
                 "measurement": "0_userdata.0.Wetterstation.Regen_Tag",
                 "orderByTime": "ASC",
                 "policy": "default",
                 "query": " from(bucket: \"${DatenBucket}\")\r\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n  |> filter(fn: (r) => r._measurement == \"${Data_Prefix}.${Data_Instanz}.Statistik.Wetter.VorTag.Regenmenge\" and r._field == \"value\")\r\n  |> set(key: \"_field\", value: \"☂️ Gestern\")\r\n  |> yield(name: \"Gestern\")\r\n  ",
                 "refId": "B",
                 "resultFormat": "time_series",
                 "select": [
                   [
                     {
                       "params": [
                         "value"
                       ],
                       "type": "field"
                     },
                     {
                       "params": [],
                       "type": "last"
                     }
                   ]
                 ],
                 "tags": []
               },
               {
                 "datasource": {
                   "type": "influxdb",
                   "uid": "ssI1YtJ4z"
                 },
                 "alias": "☂️ Heute",
                 "groupBy": [
                   {
                     "params": [
                       "$__interval"
                     ],
                     "type": "time"
                   },
                   {
                     "params": [
                       "none"
                     ],
                     "type": "fill"
                   }
                 ],
                 "hide": false,
                 "measurement": "0_userdata.0.Wetterstation.Regen_Tag",
                 "orderByTime": "ASC",
                 "policy": "default",
                 "query": " from(bucket: \"${DatenBucket}\")\r\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n  |> filter(fn: (r) => r._measurement == \"${Data_Prefix}.${Data_Instanz}.${Data_Ordnername}.Regen_Tag\" and r._field == \"value\")\r\n  |> set(key: \"_field\", value: \"☂️ Heute\")\r\n  |> yield(name: \"Heute\")\r\n\r\n  ",
                 "refId": "C",
                 "resultFormat": "time_series",
                 "select": [
                   [
                     {
                       "params": [
                         "value"
                       ],
                       "type": "field"
                     },
                     {
                       "params": [],
                       "type": "last"
                     }
                   ]
                 ],
                 "tags": []
               },
               {
                 "datasource": {
                   "type": "influxdb",
                   "uid": "ssI1YtJ4z"
                 },
                 "alias": "☂️ Heute",
                 "groupBy": [
                   {
                     "params": [
                       "$__interval"
                     ],
                     "type": "time"
                   },
                   {
                     "params": [
                       "none"
                     ],
                     "type": "fill"
                   }
                 ],
                 "hide": false,
                 "measurement": "0_userdata.0.Wetterstation.Regen_Tag",
                 "orderByTime": "ASC",
                 "policy": "default",
                 "query": " from(bucket: \"${DatenBucket}\")\r\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n  |> filter(fn: (r) => r._measurement == \"${Data_Prefix}.${Data_Instanz}.${Data_Ordnername}.Regen_Woche\" and r._field == \"value\")\r\n  |> set(key: \"_field\", value: \"☂️ aktuelle Woche\")\r\n  |> yield(name: \"aktuelle Woche\")\r\n\r\n  ",
                 "refId": "D",
                 "resultFormat": "time_series",
                 "select": [
                   [
                     {
                       "params": [
                         "value"
                       ],
                       "type": "field"
                     },
                     {
                       "params": [],
                       "type": "last"
                     }
                   ]
                 ],
                 "tags": []
               },
               {
                 "datasource": {
                   "type": "influxdb",
                   "uid": "ssI1YtJ4z"
                 },
                 "alias": "☂️ Heute",
                 "groupBy": [
                   {
                     "params": [
                       "$__interval"
                     ],
                     "type": "time"
                   },
                   {
                     "params": [
                       "none"
                     ],
                     "type": "fill"
                   }
                 ],
                 "hide": false,
                 "measurement": "0_userdata.0.Wetterstation.Regen_Tag",
                 "orderByTime": "ASC",
                 "policy": "default",
                 "query": " from(bucket: \"${DatenBucket}\")\r\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n  |> filter(fn: (r) => r._measurement == \"${Data_Prefix}.${Data_Instanz}.${Data_Ordnername}.Regen_Monat\" and r._field == \"value\")\r\n  |> set(key: \"_field\", value: \"☂️ aktueller Monat\")\r\n  |> yield(name: \"aktueller Monat\")\r\n\r\n  ",
                 "refId": "E",
                 "resultFormat": "time_series",
                 "select": [
                   [
                     {
                       "params": [
                         "value"
                       ],
                       "type": "field"
                     },
                     {
                       "params": [],
                       "type": "last"
                     }
                   ]
                 ],
                 "tags": []
               },
               {
                 "datasource": {
                   "type": "influxdb",
                   "uid": "ssI1YtJ4z"
                 },
                 "alias": "☂️ Heute",
                 "groupBy": [
                   {
                     "params": [
                       "$__interval"
                     ],
                     "type": "time"
                   },
                   {
                     "params": [
                       "none"
                     ],
                     "type": "fill"
                   }
                 ],
                 "hide": false,
                 "measurement": "0_userdata.0.Wetterstation.Regen_Tag",
                 "orderByTime": "ASC",
                 "policy": "default",
                 "query": " from(bucket: \"${DatenBucket}\")\r\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n  |> filter(fn: (r) => r._measurement == \"${Data_Prefix}.${Data_Instanz}.${Data_Ordnername}.Regen_Jahr_kumuliert\" and r._field == \"value\")\r\n  |> set(key: \"_field\", value: \"☂️ aktuelles Jahr\")\r\n  |> yield(name: \"aktuelles Jahr\")\r\n\r\n  ",
                 "refId": "F",
                 "resultFormat": "time_series",
                 "select": [
                   [
                     {
                       "params": [
                         "value"
                       ],
                       "type": "field"
                     },
                     {
                       "params": [],
                       "type": "last"
                     }
                   ]
                 ],
                 "tags": []
               },
               {
                 "datasource": {
                   "type": "influxdb",
                   "uid": "ssI1YtJ4z"
                 },
                 "alias": "☂️ Heute",
                 "groupBy": [
                   {
                     "params": [
                       "$__interval"
                     ],
                     "type": "time"
                   },
                   {
                     "params": [
                       "none"
                     ],
                     "type": "fill"
                   }
                 ],
                 "hide": false,
                 "measurement": "0_userdata.0.Wetterstation.Regen_Tag",
                 "orderByTime": "ASC",
                 "policy": "default",
                 "query": " from(bucket: \"${DatenBucket}\")\r\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\r\n  |> filter(fn: (r) => r._measurement == \"${Data_Prefix}.${Data_Instanz}.${Data_Ordnername}.Info.Regenmenge_VorJahr\" and r._field == \"value\")\r\n  |> set(key: \"_field\", value: \"☂️ VorJahr\")\r\n  |> yield(name: \"VorJahr\")\r\n\r\n  ",
                 "refId": "G",
                 "resultFormat": "time_series",
                 "select": [
                   [
                     {
                       "params": [
                         "value"
                       ],
                       "type": "field"
                     },
                     {
                       "params": [],
                       "type": "last"
                     }
                   ]
                 ],
                 "tags": []
               }
             ],
             "transformations": [
               {
                 "id": "reduce",
                 "options": {
                   "includeTimeField": false,
                   "labelsToFields": true,
                   "mode": "seriesToRows",
                   "reducers": [
                     "last"
                   ]
                 }
               }
             ],
             "transparent": true,
             "type": "table",
             "description": ""
            }
            


            Temperatur in 3h geht über den Adapter "Das Wetter" und ein kleines JS:

            
            const idTemp = '0_userdata.0.Data.Temperatur_in_3h';
            if (!existsState(idTemp)) { createState(idTemp, 0, { name: "erwartete Aussentemperatur in 3 Stunden", type: "number", role: "state", unit: "°C" }); }
            
            schedule('2 * * * *', function () {
               let hours3 = new Date().getHours() + 3;
               let id = 'daswetter.0.NextHours.Location_1.Day_1.Hour_' + hours3 + '.temp_value';
            
               if(hours3 > 24) { 
                  hours3 -= 24;
                  id = 'daswetter.0.NextHours.Location_1.Day_2.Hour_' + hours3 + '.temp_value';
                }
            
                setState(idTemp, getState(id).val, true);
            });
            
            

            Das leere Panel unter UV-Index existiert bei mir nicht mehr, aber das könnte das Panel für das "Boom-Theme" sein. Das ist eigentlich auf unsichtbar gestellt, darüber kann man aber das Hintergrundbild auswählen.


            Mit dem long/short bin ich noch unschlüssig. Eine Idee wäre in ein "Tages-Bucket" zu schreiben. Hierauf würden dann aktuelle Werte von Grafana (short) verweisen. Per Tasks wird dann alles kopiert, aggregiert und ins long geshifftet. Hierauf verweist dann Grafana auf alles was eben nicht "heute" ist (zB. Temperaturgraf der letzten 365 Tage).
            Die Retention für dieses "Tages-Bucket" könnte dann bspw. 5 Tage sein, sprich alles älter als 5 Tage wird automatisch aus diesem Bucket gelöscht. Deswegen ist die Idee mit mehreren Buckets nicht abwegig, da man pro Bucket die Retention wählen kann ;)

            Rene55R Online
            Rene55R Online
            Rene55
            schrieb am zuletzt editiert von Rene55
            #5156

            @sborg Mega Danke. Ich werde mich jetzt erstmal um die uid kümmern und dein Script einbauen. Damit komme ich bestimmt weiter. (Hab aber bestimmt noch weitere Fragen) :blush:
            Tasks wird dann alles kopiert, aggregiert und ins long geshifftet das wäre sowas, wie ich oben den Fummel betitelt hatte.

            Host: Fujitsu Intel(R) Pentium(R) CPU G4560T, 32 GB RAM, Proxmox 8.x + lxc Ubuntu 22.04
            ioBroker (8 GB RAM) Node.js: 20.19.1, NPM: 10.8.2, js-Controller: 7.0.6, Admin: 7.6.3
            Wetterstation: Froggit WH3000SE V1.6.6

            1 Antwort Letzte Antwort
            1
            • NashraN Offline
              NashraN Offline
              Nashra
              Most Active Forum Testing
              schrieb am zuletzt editiert von
              #5157

              @SBorg
              welchen Adapter nutzt du für die Ozonwerte?

              Gruß Ralf
              Mir egal, wer Dein Vater ist! Wenn ich hier angel, wird nicht übers Wasser gelaufen!!

              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

              SBorgS 1 Antwort Letzte Antwort
              0
              • NashraN Nashra

                @SBorg
                welchen Adapter nutzt du für die Ozonwerte?

                SBorgS Offline
                SBorgS Offline
                SBorg
                Forum Testing Most Active
                schrieb am zuletzt editiert von
                #5158

                @nashra
                Keinen, mir ist auch keiner bekannt, ich nutze (wie bei mir fast üblich :blush: ) ein Linux Shell-Skript.
                Bevor nun wieder die Frage kommt: nein, das kann ich schlecht zur Verfügung stellen, da es die Daten vom HLNUG bezieht und somit nur für Hessen gültig ist.

                Weil aber bestimmt hier wieder Begehrlichkeiten geweckt wurden (nehme ich mal an :innocent: ), habe ich mir heute morgen mal Gedanken gemacht und bin auf die Suche gegangen.
                Übrig bleibt eigentlich nur das "Umwelt Bundesamt", da es für ganz Deutschland Daten liefert (sry @Negalein), auch kleinere Stationen. Leider keine API verfügbar und https://www.umweltbundesamt.de/daten/luft/luftdaten/luftqualitaet/ verlangt das ausfüllen der gewünschten Daten (ist hier nicht einfach zu automatisieren, da darüber ein Einmal-Token generiert wird).
                Aber wird sind ja nicht blöd :joy:
                Über die "Stationen" kommen wir zwar zu einer ähnlichen Eingabemaske, aber nach dem ausfüllen erhalten wir einen nutzbaren Link "Station herunterladen". Per MouseOver erkennen wir nun auch einen für uns nutzbaren Link 8)
                Beispiel: https://www.umweltbundesamt.de/api/air_data/v3/measures/csv?date_from=2024-01-18&time_from=11&date_to=2024-01-18&time_to=11&data%5B0%5D%5Bco%5D=3&data%5B0%5D%5Bsc%5D=2&data%5B0%5D%5Bst%5D=533&lang=de
                Also doch eine (nicht öffentliche) API. Die Daten könnte ich automatisieren, man muss es nur einmalig per Frontend ausfüllen damit man seine StationID bekommt. In der heruntergeladenen CSV steht dann der Ozonwert drin :grinning:

                LG SBorg ( SBorg auf GitHub)
                Projekte: Lebensmittelwarnung.de | WLAN-Wetterstation | PimpMyStation

                NashraN BoronsbruderB NegaleinN 3 Antworten Letzte Antwort
                0
                • SBorgS SBorg

                  @nashra
                  Keinen, mir ist auch keiner bekannt, ich nutze (wie bei mir fast üblich :blush: ) ein Linux Shell-Skript.
                  Bevor nun wieder die Frage kommt: nein, das kann ich schlecht zur Verfügung stellen, da es die Daten vom HLNUG bezieht und somit nur für Hessen gültig ist.

                  Weil aber bestimmt hier wieder Begehrlichkeiten geweckt wurden (nehme ich mal an :innocent: ), habe ich mir heute morgen mal Gedanken gemacht und bin auf die Suche gegangen.
                  Übrig bleibt eigentlich nur das "Umwelt Bundesamt", da es für ganz Deutschland Daten liefert (sry @Negalein), auch kleinere Stationen. Leider keine API verfügbar und https://www.umweltbundesamt.de/daten/luft/luftdaten/luftqualitaet/ verlangt das ausfüllen der gewünschten Daten (ist hier nicht einfach zu automatisieren, da darüber ein Einmal-Token generiert wird).
                  Aber wird sind ja nicht blöd :joy:
                  Über die "Stationen" kommen wir zwar zu einer ähnlichen Eingabemaske, aber nach dem ausfüllen erhalten wir einen nutzbaren Link "Station herunterladen". Per MouseOver erkennen wir nun auch einen für uns nutzbaren Link 8)
                  Beispiel: https://www.umweltbundesamt.de/api/air_data/v3/measures/csv?date_from=2024-01-18&time_from=11&date_to=2024-01-18&time_to=11&data%5B0%5D%5Bco%5D=3&data%5B0%5D%5Bsc%5D=2&data%5B0%5D%5Bst%5D=533&lang=de
                  Also doch eine (nicht öffentliche) API. Die Daten könnte ich automatisieren, man muss es nur einmalig per Frontend ausfüllen damit man seine StationID bekommt. In der heruntergeladenen CSV steht dann der Ozonwert drin :grinning:

                  NashraN Offline
                  NashraN Offline
                  Nashra
                  Most Active Forum Testing
                  schrieb am zuletzt editiert von
                  #5159

                  @sborg
                  nö lass mal, so wichtig ist das nicht. Aber trotzdem danke fürs suchen :-)

                  Gruß Ralf
                  Mir egal, wer Dein Vater ist! Wenn ich hier angel, wird nicht übers Wasser gelaufen!!

                  Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                  1 Antwort Letzte Antwort
                  0
                  • SBorgS SBorg

                    @nashra
                    Keinen, mir ist auch keiner bekannt, ich nutze (wie bei mir fast üblich :blush: ) ein Linux Shell-Skript.
                    Bevor nun wieder die Frage kommt: nein, das kann ich schlecht zur Verfügung stellen, da es die Daten vom HLNUG bezieht und somit nur für Hessen gültig ist.

                    Weil aber bestimmt hier wieder Begehrlichkeiten geweckt wurden (nehme ich mal an :innocent: ), habe ich mir heute morgen mal Gedanken gemacht und bin auf die Suche gegangen.
                    Übrig bleibt eigentlich nur das "Umwelt Bundesamt", da es für ganz Deutschland Daten liefert (sry @Negalein), auch kleinere Stationen. Leider keine API verfügbar und https://www.umweltbundesamt.de/daten/luft/luftdaten/luftqualitaet/ verlangt das ausfüllen der gewünschten Daten (ist hier nicht einfach zu automatisieren, da darüber ein Einmal-Token generiert wird).
                    Aber wird sind ja nicht blöd :joy:
                    Über die "Stationen" kommen wir zwar zu einer ähnlichen Eingabemaske, aber nach dem ausfüllen erhalten wir einen nutzbaren Link "Station herunterladen". Per MouseOver erkennen wir nun auch einen für uns nutzbaren Link 8)
                    Beispiel: https://www.umweltbundesamt.de/api/air_data/v3/measures/csv?date_from=2024-01-18&time_from=11&date_to=2024-01-18&time_to=11&data%5B0%5D%5Bco%5D=3&data%5B0%5D%5Bsc%5D=2&data%5B0%5D%5Bst%5D=533&lang=de
                    Also doch eine (nicht öffentliche) API. Die Daten könnte ich automatisieren, man muss es nur einmalig per Frontend ausfüllen damit man seine StationID bekommt. In der heruntergeladenen CSV steht dann der Ozonwert drin :grinning:

                    BoronsbruderB Online
                    BoronsbruderB Online
                    Boronsbruder
                    schrieb am zuletzt editiert von Boronsbruder
                    #5160

                    @sborg
                    Doch öffentliche Api ;)
                    Git-Hub zur Luftqualität-Api des Bundes
                    Dokumentation der Api

                    Beispiel Daten für Ulm:
                    (https://umweltbundesamt.api.proxy.bund.dev/api/air_data/v2/airquality/json?date_from=2024-01-18&time_from=13&date_to=2024-01-18&time_to=13&station=228&lang=de)

                    {
                         "request": {
                                "station": "228",
                                "date_from": "2024-01-18",
                                "date_to": "2024-01-18",
                                "time_from": "13:00:00",
                                "time_to": "13:00:00",
                                "lang": "de",
                                "index": "id",
                                "datetime_from": "2024-01-18 12:00:00",
                                "datetime_to": "2024-01-18 12:00:00"
                          },
                          "data": {
                                "228": {
                                      "2024-01-18 12:00:00": [
                                            "2024-01-18 13:00:00",
                                            1,
                                            0,
                                            [
                                                  3,
                                                  64,
                                                  1,
                                                  "1.051"
                                            ],
                                            [
                                                  5,
                                                  9,
                                                  0,
                                                  "0.45"
                                            ],
                                            [
                                                  1,
                                                  7,
                                                  0,
                                                  "0.35"
                                            ]
                                      ]
                                }
                          },
                          "indices": {
                                "data": {
                                      "Id of station - string": {
                                            "Date of measure start in CET - string": [
                                                  "0: Date of measure end  in CET - string",
                                                  "1: Airquality index for all components - integer",
                                                  "2: Data incomplete (0|1) - integer",
                                                  [
                                                        "0: Id of component id - integer",
                                                        "1: Value - number",
                                                        "2: Airquality index of this component- integer",
                                                        "3: Decimal representation of Airquality index of this component - string"
                                                  ]
                                            ]
                                      }
                                }
                          },
                          "count": 1
                    
                    }
                    
                    

                    => 64 µg/m³ Ozon / 9 µg/m³ NO2 / 7 µg/m³ Feinstaub PM10

                    Man kann anstatt der 228 auch die von der Stationsseite den angezeigten Code DEBW019 der Station verwenden

                    Und anscheinend gibts auch schon ne Api v3

                    Da kommt bei der Station dann sogar ein PM2.5-Wert mit

                    1 Antwort Letzte Antwort
                    1
                    • Rene55R Online
                      Rene55R Online
                      Rene55
                      schrieb am zuletzt editiert von
                      #5161

                      @boronsbruder Das schreit ja förmlich nach einem neuen Adapter

                      Host: Fujitsu Intel(R) Pentium(R) CPU G4560T, 32 GB RAM, Proxmox 8.x + lxc Ubuntu 22.04
                      ioBroker (8 GB RAM) Node.js: 20.19.1, NPM: 10.8.2, js-Controller: 7.0.6, Admin: 7.6.3
                      Wetterstation: Froggit WH3000SE V1.6.6

                      BoronsbruderB 1 Antwort Letzte Antwort
                      0
                      • SBorgS SBorg

                        @nashra
                        Keinen, mir ist auch keiner bekannt, ich nutze (wie bei mir fast üblich :blush: ) ein Linux Shell-Skript.
                        Bevor nun wieder die Frage kommt: nein, das kann ich schlecht zur Verfügung stellen, da es die Daten vom HLNUG bezieht und somit nur für Hessen gültig ist.

                        Weil aber bestimmt hier wieder Begehrlichkeiten geweckt wurden (nehme ich mal an :innocent: ), habe ich mir heute morgen mal Gedanken gemacht und bin auf die Suche gegangen.
                        Übrig bleibt eigentlich nur das "Umwelt Bundesamt", da es für ganz Deutschland Daten liefert (sry @Negalein), auch kleinere Stationen. Leider keine API verfügbar und https://www.umweltbundesamt.de/daten/luft/luftdaten/luftqualitaet/ verlangt das ausfüllen der gewünschten Daten (ist hier nicht einfach zu automatisieren, da darüber ein Einmal-Token generiert wird).
                        Aber wird sind ja nicht blöd :joy:
                        Über die "Stationen" kommen wir zwar zu einer ähnlichen Eingabemaske, aber nach dem ausfüllen erhalten wir einen nutzbaren Link "Station herunterladen". Per MouseOver erkennen wir nun auch einen für uns nutzbaren Link 8)
                        Beispiel: https://www.umweltbundesamt.de/api/air_data/v3/measures/csv?date_from=2024-01-18&time_from=11&date_to=2024-01-18&time_to=11&data%5B0%5D%5Bco%5D=3&data%5B0%5D%5Bsc%5D=2&data%5B0%5D%5Bst%5D=533&lang=de
                        Also doch eine (nicht öffentliche) API. Die Daten könnte ich automatisieren, man muss es nur einmalig per Frontend ausfüllen damit man seine StationID bekommt. In der heruntergeladenen CSV steht dann der Ozonwert drin :grinning:

                        NegaleinN Offline
                        NegaleinN Offline
                        Negalein
                        Global Moderator
                        schrieb am zuletzt editiert von
                        #5162

                        @sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                        sry @Negalein)

                        No Problem.
                        Ich brauch Ozon nicht.
                        Wenn doch, verwende ich einen deutschen Ort.
                        Kann von Ö nach DE rüber spucken. :joy: :joy:

                        ° Node.js: 20.17.0 NPM: 10.8.2
                        ° Proxmox, Ubuntu 22.04.3 LTS
                        ° Fixer ---> iob fix

                        1 Antwort Letzte Antwort
                        0
                        • Rene55R Rene55

                          @boronsbruder Das schreit ja förmlich nach einem neuen Adapter

                          BoronsbruderB Online
                          BoronsbruderB Online
                          Boronsbruder
                          schrieb am zuletzt editiert von Boronsbruder
                          #5163

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

                          Rene55R 1 Antwort Letzte Antwort
                          2
                          • BoronsbruderB Boronsbruder

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

                            Rene55R Online
                            Rene55R Online
                            Rene55
                            schrieb am zuletzt editiert von
                            #5164

                            @boronsbruder Ich schau mal, ob es da schon eine Anfrage auf einen Adapter zu diesem Thema gibt. Danke für dein Engagement, aber wir sollten den Thread hier nicht weiter volltexten sondern wenn du willst in einem Neuen.

                            Host: Fujitsu Intel(R) Pentium(R) CPU G4560T, 32 GB RAM, Proxmox 8.x + lxc Ubuntu 22.04
                            ioBroker (8 GB RAM) Node.js: 20.19.1, NPM: 10.8.2, js-Controller: 7.0.6, Admin: 7.6.3
                            Wetterstation: Froggit WH3000SE V1.6.6

                            BoronsbruderB 1 Antwort Letzte Antwort
                            0
                            • Rene55R Rene55

                              @boronsbruder Ich schau mal, ob es da schon eine Anfrage auf einen Adapter zu diesem Thema gibt. Danke für dein Engagement, aber wir sollten den Thread hier nicht weiter volltexten sondern wenn du willst in einem Neuen.

                              BoronsbruderB Online
                              BoronsbruderB Online
                              Boronsbruder
                              schrieb am zuletzt editiert von
                              #5165

                              @rene55 sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                              @boronsbruder ... aber wir sollten den Thread hier nicht weiter volltexten sondern wenn du willst in einem Neuen.

                              Hier is die V2 des Skripts

                              NashraN 2 Antworten Letzte Antwort
                              0
                              • BoronsbruderB Boronsbruder

                                @rene55 sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                @boronsbruder ... aber wir sollten den Thread hier nicht weiter volltexten sondern wenn du willst in einem Neuen.

                                Hier is die V2 des Skripts

                                NashraN Offline
                                NashraN Offline
                                Nashra
                                Most Active Forum Testing
                                schrieb am zuletzt editiert von
                                #5166

                                @boronsbruder sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                @rene55 sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                @boronsbruder ... aber wir sollten den Thread hier nicht weiter volltexten sondern wenn du willst in einem Neuen.

                                Hier is die V2 des Skripts

                                Die v2 installiert aber jeden Morgen kommt dieser Fehler zur selben Uhrzeit

                                2024-01-22 02:09:47.206 - info: linux-control.0 (1080) successful received data from ioBroker (192.168.1.14:22)
                                2024-01-22 02:10:00.797 - error: javascript.0 (283) script.js.Wetter.Luftqualität: TypeError: Cannot read properties of undefined (reading '2024-01-22 00:00:00')
                                2024-01-22 02:10:00.797 - error: javascript.0 (283) at get_data (script.js.Wetter.Luftqualität:148:54)
                                2024-01-22 02:10:00.797 - error: javascript.0 (283) at processTicksAndRejections (node:internal/process/task_queues:95:5)
                                2024-01-22 02:12:00.026 - info: host.ioBroker instance system.adapter.meteoalarm.2 started with pid 1832595
                                

                                Gruß Ralf
                                Mir egal, wer Dein Vater ist! Wenn ich hier angel, wird nicht übers Wasser gelaufen!!

                                Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                BoronsbruderB 1 Antwort Letzte Antwort
                                0
                                • NashraN Nashra

                                  @boronsbruder sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                  @rene55 sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                  @boronsbruder ... aber wir sollten den Thread hier nicht weiter volltexten sondern wenn du willst in einem Neuen.

                                  Hier is die V2 des Skripts

                                  Die v2 installiert aber jeden Morgen kommt dieser Fehler zur selben Uhrzeit

                                  2024-01-22 02:09:47.206 - info: linux-control.0 (1080) successful received data from ioBroker (192.168.1.14:22)
                                  2024-01-22 02:10:00.797 - error: javascript.0 (283) script.js.Wetter.Luftqualität: TypeError: Cannot read properties of undefined (reading '2024-01-22 00:00:00')
                                  2024-01-22 02:10:00.797 - error: javascript.0 (283) at get_data (script.js.Wetter.Luftqualität:148:54)
                                  2024-01-22 02:10:00.797 - error: javascript.0 (283) at processTicksAndRejections (node:internal/process/task_queues:95:5)
                                  2024-01-22 02:12:00.026 - info: host.ioBroker instance system.adapter.meteoalarm.2 started with pid 1832595
                                  
                                  BoronsbruderB Online
                                  BoronsbruderB Online
                                  Boronsbruder
                                  schrieb am zuletzt editiert von
                                  #5167

                                  @nashra
                                  Hab ich auch bemerkt.
                                  Die Api kann meines Erachtens nicht mit Stunde 0 umgehen.
                                  Hab die Kollegen mal angeschrieben, aber ich wurde so wie es aussieht missverstanden.

                                  1 Antwort Letzte Antwort
                                  1
                                  • BoronsbruderB Online
                                    BoronsbruderB Online
                                    Boronsbruder
                                    schrieb am zuletzt editiert von
                                    #5168

                                    @SBorg
                                    Falls du es mal brauchst:
                                    API V3 Doku

                                    1 Antwort Letzte Antwort
                                    1
                                    • SBorgS Offline
                                      SBorgS Offline
                                      SBorg
                                      Forum Testing Most Active
                                      schrieb am zuletzt editiert von
                                      #5169

                                      Ich verstehe deren System auch nicht so ganz. Eigentlich ist doch UBA nur Deutschland...?
                                      Wollen sie jetzt noch Zeitzonen in BRD einführen? Bin schon mal auf die Sommer-/Winterzeit-Thematik bei denen gespannt.

                                      Aber 1-24 bei den Stunden ist auch der Burner. Wer arbeitet den in der Computertechnologie mit 24:00 Uhr?
                                      Ich bin jetzt im NodeRed-Flow den einfachen Weg gegangen und verzichte einfach auf den 0:00 Uhr Wert, wobei ich es eh nicht nutze. Ich nehme weiter die Daten des HLNUG, nur die Karte vom UBA, da die vom HLNUG schon ein paar Wochen nicht mehr aktualisiert wird :(
                                      Bild 001.png
                                      Bild 002.png

                                      LG SBorg ( SBorg auf GitHub)
                                      Projekte: Lebensmittelwarnung.de | WLAN-Wetterstation | PimpMyStation

                                      BoronsbruderB 1 Antwort Letzte Antwort
                                      0
                                      • SBorgS SBorg

                                        Ich verstehe deren System auch nicht so ganz. Eigentlich ist doch UBA nur Deutschland...?
                                        Wollen sie jetzt noch Zeitzonen in BRD einführen? Bin schon mal auf die Sommer-/Winterzeit-Thematik bei denen gespannt.

                                        Aber 1-24 bei den Stunden ist auch der Burner. Wer arbeitet den in der Computertechnologie mit 24:00 Uhr?
                                        Ich bin jetzt im NodeRed-Flow den einfachen Weg gegangen und verzichte einfach auf den 0:00 Uhr Wert, wobei ich es eh nicht nutze. Ich nehme weiter die Daten des HLNUG, nur die Karte vom UBA, da die vom HLNUG schon ein paar Wochen nicht mehr aktualisiert wird :(
                                        Bild 001.png
                                        Bild 002.png

                                        BoronsbruderB Online
                                        BoronsbruderB Online
                                        Boronsbruder
                                        schrieb am zuletzt editiert von
                                        #5170

                                        @sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                        Wer arbeitet den in der Computertechnologie mit 24:00 Uhr?

                                        Jeder der keinen Bock hat sich Gedanken um Jahres-, Monats- oder Tageswechsel zu machen...
                                        Weisst ja 0 Uhr - 1 :D

                                        1 Antwort Letzte Antwort
                                        0
                                        • BoronsbruderB Online
                                          BoronsbruderB Online
                                          Boronsbruder
                                          schrieb am zuletzt editiert von Boronsbruder
                                          #5171

                                          @SBorg
                                          Ich hab da was für dich:

                                          2024-01-24 23:58:05.001 - info: simple-api.0 (5300) State value to set for "0_userdata.0.Wetterstation.Info.Solarenergie_VorTag" has to be type "number" but received type "string"
                                          2024-01-24 23:58:05.175 - info: simple-api.0 (5300) State value to set for "0_userdata.0.Wetterstation.Info.Solarenergie_Woche" has to be type "number" but received type "string"
                                          2024-01-24 23:58:05.175 - info: simple-api.0 (5300) State value to set for "0_userdata.0.Wetterstation.Info.Solarenergie_Monat" has to be type "number" but received type "string"
                                          2024-01-24 23:58:05.176 - info: simple-api.0 (5300) State value to set for "0_userdata.0.Wetterstation.Info.Solarenergie_Jahr" has to be type "number" but received type "string"
                                          2024-01-24 23:58:05.176 - info: simple-api.0 (5300) State value to set for "0_userdata.0.Wetterstation.tempData.Solarenergie" has to be type "string" but received type "number" 
                                          

                                          Das passiert, wenn die Solarenergie-Datenpunkte leer sind.
                                          Der TempData steht z.B. gerade auf 404,662, weil ich seit 2 Tagen erst wieder, in Ermangelung eines Aussensensors, Daten bekomme.
                                          Wenn die SimpleApi halt alle 30 Sekunden rummotzt gibt das ganz schön große Logs ;)

                                          Eigentlich eher ein Schönheitsfehler...

                                          SBorgS 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          653

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe