Ich hab ein bischen mit den Daten von OpenWeatherMap OneCall 3.0 und p44scrip rum experiementiert.
Image description
Seitens des P44 geht das ganz gut aber es scheint wohl so dass der dSS mit UV-Index und dergleichen nicht viel anfangen kann. Kann das jemand bestätigen? Bei mir sieht das so aus.Image description
🙁

  • Hinti hat auf diesen Beitrag geantwortet.
    2 Monate später

    Nick Ja das ist leider so :-( Es werden nur definierte Sensortypen übergeben an dSS

    7 Tage später

    noob@linux:~$ googler -w Synonym für 'frustrierend'

    ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣶⣤⣤⣤⣶⣦⣤⣤⣤⣄⣀⠀⠀⠀⠀⢠⡀⠀⠀⠀⠀⠀⠀⠀⠀
    ⠀⠀⠀⠀⠀⠀⠰⣷⣶⣤⡀⠀⠀⣀⣤⣶⣿⡿⠿⣿⡟⠛⠉⣩⣿⣿⡿⠿⠿⢿⣿⣶⣤⡀⠘⣷⢸⣄⡀⣄⠀⠀⠀⠀
    ⠀⠀⠀⠀⠀⠀⠀⠀⠙⠻⣿⣷⣿⣿⠟⠉⠀⠀⠀⣿⡇⠀⣼⣿⠋⠀⠀⠀⠀⠀⠈⣹⣿⣿⣦⣽⣟⣿⣇⣿⣠⡀⠀⠀
    ⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣟⣻⣿⣷⣄⠀⠀⠀⣿⡇⢰⣿⡇⠀⠀⠀⠀⠀⠀⠸⣿⣽⡿⢿⣿⣿⣿⣿⣸⣿⣿⣇⠀
    ⠀⠀⠀⠀⠀⠀⣠⣾⣿⡿⠿⠟⠿⣿⣿⢿⣿⣆⠀⠻⠇⢸⣿⡇⠀⠀⠀⠀⠀⠀⠀⠈⠉⠁⢀⣿⣿⣿⣿⣇⣿⣿⣿⠀
    ⠀⠀⠀⠀⠀⣴⣿⡿⠿⢿⡆⠀⠀⣿⣿⠀⠉⠋⠀⠀⠀⠸⣿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⠛⢿⣿⣿⣿⣯⣿⠀
    ⠀⠀⠀⢀⣾⣿⠋⠄⠀⣸⡿⠀⠀⣿⣿⠀⠀⠀⠀⠀⠀⠀⢻⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⡏⠀⠈⢿⣿⣿⣿⡙⠀
    ⠀⠀⠀⣾⣿⣧⣤⣶⡾⠟⠁⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠻⣿⣧⡀⠀⠀⠀⠀⠀⢠⣿⡿⠀⠀⠀⠈⣿⣿⣿⣧⠀
    ⠀⠀⣼⣿⡃⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣦⡀⠀⠀⣠⣿⡿⠁⠀⠀⠀⠀⠸⣿⣿⣿⠄
    ⠀⢰⣿⡿⣿⣷⣄⠀⠀⠀⠀⠀⠀⣿⣿⠁⠀⠀⠀⠀⢀⣀⣀⣀⣀⡀⠙⠿⣿⣷⣶⣿⡿⠁⠀⠀⠀⠀⢀⡀⢿⣿⣇⠀
    ⠀⣼⣿⠁⠈⠻⢿⣷⣦⣤⣀⣀⣠⣿⡿⠀⢀⣤⣶⣿⠿⠿⢿⣿⡿⢿⣿⣶⣤⡉⠉⠁⠀⠀⠀⠀⠀⢰⣾⣧⢸⣿⣿⠀
    ⠀⣿⣿⠀⠀⠀⠀⠉⠛⠻⠿⠿⠿⠛⠁⢠⣿⡟⢹⣿⡆⠀⣸⣿⣧⠀⣸⣿⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⣿⣿⡄⣿⣿⠀
    ⠀⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣆⢸⡿⣿⣄⣿⠏⠻⠿⠟⠙⢿⣾⣿⣿⣦⡀⠀⠀⣤⠀⢸⣿⣿⣿⣿⡇
    ⠀⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⢿⣿⠇⠈⠛⠋⠀⠀⠀⠀⠀⠀⠀⠉⠙⣿⣷⡄⢀⣸⡆⠀⢿⣿⣿⣿⠁
    ⣀⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣯⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣾⣿⣿⣷⣼⣿⣿⡿⠀
    ⢹⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⡿⣿⣿⣿⠷⠀
    ⣾⣿⣿⣧⠀⠀⢶⠀⣶⠀⠀⠀⠀⣾⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⡀⠀
    ⢿⣼⣿⣿⡄⠀⠘⣇⢹⣇⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡄⠀⢸⣿⣿⣿⡟⠁⠹⣧⠀
    ⠘⣷⢻⣿⣿⡀⡀⢻⡄⣿⡀⣧⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣶⣄⠀⣠⣶⣾⣧⣼⣿⣿⡿⣯⢻⡀⠀⠀⠀
    ⠀⢻⣏⣿⢻⣿⣷⣾⣧⢸⣧⣿⡀⣿⡇⠀⠀⠀⣠⣤⣄⠀⣠⣶⣄⣾⡟⠹⣿⣿⣿⣭⣿⣿⡿⣿⠙⣇⠻⠈⠷⠀⠀⠀
    ⠀⠈⣿⡜⣇⢿⡿⣿⣿⣾⣿⣟⣧⣿⡇⠀⠀⢸⣿⠉⢿⣿⣿⣻⣿⣿⣥⣴⣶⣿⣿⣿⠛⢿⣷⠸⣆⠉⠀⠀⠀⠀⠀⠀
    ⠀⠀⠘⠷⢹⡌⠿⠻⠿⠿⠿⢿⣿⣿⣷⣶⣶⣾⣿⣶⣶⣿⠿⠟⠛⠛⠛⠉⠉⠁⠀⠘⠆⠈⠘⠃⠀⠀⠀⠀⠀⠀⠀⠀
    ⠀⠀⠀⠀⠀⠃⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

    Ja, es ist schon etwas frustrierend. Vor allem, weil alle diese Sensortypen in dS an sich definiert sind, nur leider nicht durchgängig implementiert.

    Aber es gibt Workarounds:

    Entweder die Auswertung der Sensoren in P44-Evaluatoren machen, und nur die resultierenden Schaltsignale im dSS dann für Szenentrigger oder Zustände zu verwenden.

    Oder wenn der Sensorwert doch direkt im dSS benötigt wird, kann man einen "Sensor Evaluator" nehmen und dem einen Ausgangstypen geben, der vom dSS verarbeitet wird, und als Eingang den eigentlichen Sensor. Dann stimmt zwar die angezeigte Masseinheit im dSS nicht, aber mindestens der numerische Wert kann in Benutzerdefinierten Zuständen benutzt werden.

    Coole Idee

    Damit ich mich dem aber witmen kann muss ich erstmal verschen den Niederschlag zu bekommtn. Im Moment funktioniert dass noch nicht. Alternativ: Ist es möglich einen String-Wert zu Importieren? Ich denke dabei an die Wetterbeschreibung.

    EDIT:// Für alle Werte von OpenWeatherMap die sich hinter einem [ befinden erhalte ich keine Daten. Gut zu sehen am Printscreen oben bei Mondphase und Niederschlag.

    OpenWeatherMap
    {
    "current": {
    "temp": 282.21,
    "feels_like": 278.41,
    "pressure": 1014,
    "humidity": 65,
    "dew_point": 275.99,
    "uvi": 2.55,
    "clouds": 40,
    "visibility": 10000,
    "wind_speed": 8.75,
    "wind_deg": 360,
    "wind_gust": 13.89,
    "weather": [
    {
    "id": 802,
    "main": "Clouds",
    "description": "scattered clouds",
    "icon": "03d"
    }
    ]
    },

    P44 script
    if (isvalid(weather.current.temp)) {
    message(format("S0=%.1f",weather.current.temp))
    }
    - funktioniert

    if (isvalid(weather.current.weather.id)) {
    message(format("S0=%.1f",weather.current.weather.id))
    }
    - funktioniert NICHT

    Ich weiss ich muss was ändern, aber ich komme nicht darauf.

    Die eckige Klammer [ heisst, dass das Feld ein Array ist, also eine durchnumerierte Liste von 0..n Elementen.

    In Deinem Beispiel ist in weather nur ein Element drin, das könntest du dir die id wie folgt greifen:

    if (isvalid(weather.current.weather[0].id)) {
      message(format("S0=%.1f",weather.current.weather[0].id))
    }

    Das [0] bedeutet "das erste (nullte) Element im Array" (in der IT beginnt man das Durchnumerieren oft bei 0, nicht bei 1 😏 ).

    [1] wäre dann das zweite, etc.

    Um die Anzahl der Elemente in einem Array zu finden, gibts in p44script die Funktion elements(). In dem Beispiel ergäbe also elements(weather.current.weather) = 1, weil nur ein Element drin ist.

    Wozu und wann es in OpenWeatherMap mehrere Wetter-Elemente geben kann, ist mir jetzt gerade nicht klar, aber das steht vermutlich irgendwo in deren API doku.

    • Nick hat auf diesen Beitrag geantwortet.

      luz
      Okey danke, das hat schon mal weiter geholfen. Allerdings klappt noch nicht alles daher muss ich nochmal Nachffrage. Das ist so richtig?

      if (elements(weather.current.weather) = 3) {
          message(format("S11=%.1f",weather.current.weather[0].id))
        }
        if (elements(weather.current.weather) = 3) {
          message(format("S12=%.1f",weather.current[1].weather.main))
        }

      Was über die One Call API kommt sieht so aus.

      {
        "lat": 39.31,
        "lon": -74.5,
        "timezone": "America/New_York",
        "timezone_offset": -18000,
        "current": {
          "dt": 1646318698,
          "sunrise": 1646306882,
          "sunset": 1646347929,
          "temp": 282.21,
          "feels_like": 278.41,
          "pressure": 1014,
          "humidity": 65,
          "dew_point": 275.99,
          "uvi": 2.55,
          "clouds": 40,
          "visibility": 10000,
          "wind_speed": 8.75,
          "wind_deg": 360,
          "wind_gust": 13.89,
          "weather": [
            {
              "id": 802,
              "main": "Clouds",
              "description": "scattered clouds",
              "icon": "03d"
            }
          ]
        },
        "minutely": [
          {
            "dt": 1646318700,
            "precipitation": 0
          },
          ...
        },
          "hourly": [
          {
            "dt": 1646316000,
            "temp": 281.94,
            "feels_like": 278.49,
            "pressure": 1014,
            "humidity": 67,
            "dew_point": 276.16,
            "uvi": 1.49,
            "clouds": 52,
            "visibility": 10000,
            "wind_speed": 7.16,
            "wind_deg": 313,
            "wind_gust": 10.71,
            "weather": [
              {
                "id": 803,
                "main": "Clouds",
                "description": "broken clouds",
                "icon": "04d"
              }
            ],
            "pop": 0.03
          },
          ...
        }
          "daily": [
          {
            "dt": 1646326800,
            "sunrise": 1646306882,
            "sunset": 1646347929,
            "moonrise": 1646309880,
            "moonset": 1646352120,
            "moon_phase": 0.03,
            "temp": {
              "day": 281.63,
              "min": 271.72,
              "max": 282.21,
              "night": 271.72,
              "eve": 277.99,
              "morn": 280.92
            },
            "feels_like": {
              "day": 277.83,
              "night": 264.72,
              "eve": 273.35,
              "morn": 277.66
            },
            "pressure": 1016,
            "humidity": 55,
            "dew_point": 273.12,
            "wind_speed": 9.29,
            "wind_deg": 3,
            "wind_gust": 16.48,
            "weather": [
              {
                "id": 500,
                "main": "Rain",
                "description": "light rain",
                "icon": "10d"
              }
            ],
            "clouds": 49,
            "pop": 0.25,
            "rain": 0.11,
            "uvi": 3.38
          },
          ...
          },
          "alerts": [
          {
            "sender_name": "NWS Philadelphia - Mount Holly (New Jersey, Delaware, Southeastern Pennsylvania)",
            "event": "Small Craft Advisory",
            "start": 1646344800,
            "end": 1646380800,
            "description": "...SMALL CRAFT ADVISORY REMAINS IN EFFECT FROM 5 PM THIS\nAFTERNOON TO 3 AM EST FRIDAY...\n* WHAT...North winds 15 to 20 kt with gusts up to 25 kt and seas\n3 to 5 ft expected.\n* WHERE...Coastal waters from Little Egg Inlet to Great Egg\nInlet NJ out 20 nm, Coastal waters from Great Egg Inlet to\nCape May NJ out 20 nm and Coastal waters from Manasquan Inlet\nto Little Egg Inlet NJ out 20 nm.\n* WHEN...From 5 PM this afternoon to 3 AM EST Friday.\n* IMPACTS...Conditions will be hazardous to small craft.",
            "tags": [
      
            ]
          },
          ...
        ]

      Wobei die "..." bedeutet dass da noch mehr ist. Als beispiel habe ich dir den auszug aus "weather.minutely".

      "minutely":[{"dt":1682577300,"precipitation":0},{"dt":1682577360,"precipitation":0},{"dt":1682577420,"precipitation":0},{"dt":1682577480,"precipitation":0},{"dt":1682577540,"precipitation":0},{"dt":1682577600,"precipitation":0},{"dt":1682577660,"precipitation":0},{"dt":1682577720,"precipitation":0},{"dt":1682577780,"precipitation":0},{"dt":1682577840,"precipitation":0},{"dt":1682577900,"precipitation":0},{"dt":1682577960,"precipitation":0},{"dt":1682578020,"precipitation":0},{"dt":1682578080,"precipitation":0},{"dt":1682578140,"precipitation":0},{"dt":1682578200,"precipitation":0},{"dt":1682578260,"precipitation":0},{"dt":1682578320,"precipitation":0},{"dt":1682578380,"precipitation":0},{"dt":1682578440,"precipitation":0},{"dt":1682578500,"precipitation":0},{"dt":1682578560,"precipitation":0},{"dt":1682578620,"precipitation":0},{"dt":1682578680,"precipitation":0.1034},{"dt":1682578740,"precipitation":0.1092},{"dt":1682578800,"precipitation":0.115},{"dt":1682578860,"precipitation":0.112},{"dt":1682578920,"precipitation":0.109},{"dt":1682578980,"precipitation":0.106},{"dt":1682579040,"precipitation":0.103},{"dt":1682579100,"precipitation":0.1},{"dt":1682579160,"precipitation":0},{"dt":1682579220,"precipitation":0},{"dt":1682579280,"precipitation":0},{"dt":1682579340,"precipitation":0},{"dt":1682579400,"precipitation":0},{"dt":1682579460,"precipitation":0},{"dt":1682579520,"precipitation":0},{"dt":1682579580,"precipitation":0},{"dt":1682579640,"precipitation":0},{"dt":1682579700,"precipitation":0},{"dt":1682579760,"precipitation":0},{"dt":1682579820,"precipitation":0},{"dt":1682579880,"precipitation":0},{"dt":1682579940,"precipitation":0},{"dt":1682580000,"precipitation":0},{"dt":1682580060,"precipitation":0},{"dt":1682580120,"precipitation":0},{"dt":1682580180,"precipitation":0},{"dt":1682580240,"precipitation":0},{"dt":1682580300,"precipitation":0},{"dt":1682580360,"precipitation":0},{"dt":1682580420,"precipitation":0},{"dt":1682580480,"precipitation":0},{"dt":1682580540,"precipitation":0},{"dt":1682580600,"precipitation":0},{"dt":1682580660,"precipitation":0},{"dt":1682580720,"precipitation":0},{"dt":1682580780,"precipitation":0},{"dt":1682580840,"precipitation":0},{"dt":1682580900,"precipitation":0}]}
      Meinem Verstäntnis nach elements(weather.minutely) = 60 ?


      • luz und Nick haben auf diesen Beitrag geantwortet.

        Beim zweiten Teil (Auslesen von main) hast Du den Array-Index (also das [1]) am falschen Ort, es gehört hinter weather, nicht current. Weil current ist kein Array, sondern ein Objekt mit Feldern (das sind die mit geschweiften Klammern { … }. Erst das Feld weather innerhalb current ist dann ein Array…

        Wieso testest Du die Array-Grösse auf 3 (elements() = 3). Wenn im Array nicht wirklich 3 Elemente drin sind (im Beispiel ists nur eins), dann wird die Bedingung nie erfüllt sein.

        minutely ist auch wieder ein Array-Feld (der Inhalt ist in eckigen Klammern), diesmal eins mit ganz vielen Elementen, die sind in Arrays durch Kommas getrennt. Wenn Du da eins rausfischen willst wäre das dann sowas wie:

        weather.minutely[17].precipitation

        Nick Meinem Verstäntnis nach elements(weather.minutely) = 60 ?

        Vielleicht, aber das muss die API-Dok von OpenWeatherMap sagen. minutely heisst ja nur "minütlich", es kann auch sein dass hier mehr oder weniger Daten als genau für eine Stunde kommen.

        • Nick hat auf diesen Beitrag geantwortet.

          luz
          Ich glaube jetzt verstehe ich dich nicht. Die 3 habe ich dahin gepackt weil das Array "weather" 4 elemente hat. Nein?

          "weather": [
                {
                  "id": 802,
                  "main": "Clouds",
                  "description": "scattered clouds",
                  "icon": "03d"
                }
              ]

          Das mit dem Arrey-Index [1] tut mir leid, ich wollte beim testen "main" kurz auschalten und hab dafür den Wert absichtlich falsch gesetzt. Was ohnehin doof ist weil "main" ein String ist und daher wohl ohnehin nichts liefert. Wirklich blöd aber ist das ich den auch noch poste. Sorry, wirklich. 🙁
          Bezüglich "minutely" hatte ich im die minütlichen Einträgen der letzten 60 Minuten im Kopf, und dass da eh nur Niederschlag und Zreitstempel drin sind. Ob das auch stimmt müsste ich aber auch .. naja lesen halt. 🙂
          Mich verwirrt allerdings dass auch mit "weather.minutely[17].precipitation" (weshalb auch immer 17) ebenfalls kein Ergebnis rein kommt. An der 0 sollte es eigentlich nicht leigen oder? Jedenfalls zeigen andere auch ein 0, z:B "weather.timezone" was völlig irre ist, weil der wert irgenwie komplett falsch ist. x)

          Btw. dein Idee mit dem "Sensor Evaluator" hat super funktioniert. UV-Index, Bewölkung, Taupunkt und Wetter-ID werden jetzt zwar in lux angezeigt, aber hey.. ¯_(ツ)_/¯

          • luz hat auf diesen Beitrag geantwortet.

            Nick Ich glaube jetzt verstehe ich dich nicht. Die 3 habe ich dahin gepackt weil das Array "weather" 4 elemente hat. Nein?

            Nein 😉
            Der Array weather hat nur ein Element. Das Objekt darin hat dann 4.

            Und ja, die IT-Zählweise ist gewöhnungbedürftig: Anzahlen werden schon normal (4 wenn es 4 sind...) angegeben. Nur das Abzählen beginnt bei 0. Also haben in einem Array mit 4 Elementen diese die Nummern 0,1,2,3.

            Es zählen im Array die Dinge, die direkt in den eckigen Klammern stehen, also z.B:

            // Array mit 3 Elementen (drei Zahlen: 7,5,42)
            [ 7, 5, 42 ]
            
            // Array mit 2 Elementen, nämlich der String "gugus" und ein Objekt, das seinerseits wieder 2 Felder "a" und "b" hat.
            [ "gugus", { "a":23, "b":42 } ]

            Tipp- und Denkfehler gehören zum Programmieren, mach Dir keine Sorgen!

            Nick Mich verwirrt allerdings dass auch mit "weather.minutely[17].precipitation" (weshalb auch immer 17) ebenfalls kein Ergebnis rein kommt.

            17 war nur ein willkürliches Beispiel. Das greift das 18. Objekt raus, und wenn ich mich in Deinem Beispiel nicht verzählt habe, dann ist dort precipitation eh 0. Aber dieses 0 sollte als Sensorwert dann schon kommen.
            Gibt's denn die precipitation in der API nicht direkt? So im Sinn: es regnet, oder es regnet nicht?

            Diese "minutely" scheinen mir eher Voraussagen zu sein, ob es in der nächsten Stunde regnen wird?

            Wenn das so ist könntest einfach den ersten rausgreifen, das wäre dann ja ziemlich der Ist-Wert, also den mit Index 0:

            weather.minutely[0].precipitation
            • Nick hat auf diesen Beitrag geantwortet.
            • Nick gefällt das.

              luz Ah! So ist dass. 🙂
              Habs gleich geändert und jetzt kommt bei "main" 0.00 juhu (first time)

              precipitation ist der Minütlich gemssene Niederschlag in mm/h (sensortype 21) mit datatimestamp (dt - Time of the forecasted data, unix, UTC) vorab.

              Nick {"dt":1682578800,"precipitation":0.115},

              Was du meinst ist weather.hourly[0].pop. oder current.weather.id. Hab ich auch drin, pop liefert wie precipitation auch keine werte (noch nicht). 🙂