KNX Data Secure Unterstützung
für KNX Logger und KNX Busmonitor

KNX Diagnose Monitor, Import des ETS Projektes deutlich beschleunigt, Suche in der Navigation
Mehr Informationen dazu hier im Forum

Insider Version 6 zur 4.5 jetzt für alle Mitglieder des Insider Clubs installierbar
Alle Infos zum Update im Timberwolf Wiki

[V4.5 IP3] Custom Logik "REST API gesuchter Wert nicht gefunden"

Hier stellen Foristen und Kunden Ihre EIGENEN Logikbausteine vor. Diese Logikbausteine stehen jedem im Rahmen der vom Autor eingeräumten / genannten Lizenz zur Verfügung.
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln
Antworten

Ersteller
ms20de
Elaborated Networks
Elaborated Networks
Reactions:
Beiträge: 1267
Registriert: Sa Aug 11, 2018 9:14 pm
Hat sich bedankt: 358 Mal
Danksagung erhalten: 696 Mal

[V4.5 IP3] Custom Logik "REST API gesuchter Wert nicht gefunden"

#1

Beitrag von ms20de »

Hallo Zusammen,

mein Problem ist, was ich tun kann, wenn ich über die HTTP-API eine Schnittstelle abfrage, die JSON-Daten zurückgibt, jedoch nicht immer alle Schlüssel vorhanden sind. Ich möchte eine Aktion auslösen, wenn ein bestimmter Schlüssel fehlt.

Konkretes Beispiel: Ich möchte die NINA API abfragen und eine aktive Warnung in der Visualisierung anzeigen. Wenn eine Warnung aufgehoben wird, könnte es eine Entwarnung geben, die jedoch ebenfalls aus dem JSON verschwindet. Stattdessen wird nur noch ein leeres Array von der API zurückgegeben. Wie kann ich anzeigen, dass es keine Warnung mehr gibt, anstatt dass der letzte Text bestehen bleibt?

Meine Lösung ist, dass die Logik mit zwei Eingängen mit der HTTP-API verbunden wird, einen der die optionale Warnmeldung enthält und einer der immer aufgerufen wird wenn die Abfrage ausgeführt wurde. Beide Eingänge Triggern die Logik und es wird überprüft welcher Eingang die Logik gestartet hat, um die Entscheidungen zu treffen: Traf eine Warnmeldung ein und danach kann die Info dass die Abfrage lief → Warnmeldung weitergeben. Keine Warnmeldung vorher und die Abfrage wurde ausgeführt → Konstanten Text weitergeben, den man in der VISU in den Darstellungsregeln mappen kann.


Bild

Bild

Das Status-Objekt "request warning occurred" benutze ich aktuell nur als Trigger dass die Abfrage gelaufen ist und der Wert wird ignoriert. Man könnte das noch ausbauen, dass dann eine weitere Meldung angezeigt wird, dass die Warnungen nicht abgefragt werden konnten.

Code: Alles auswählen

{
    
    "Level": [
        
        // Input Level
        ["$in_current_warning","string,64", ""],
        ["$in_request_run","bool",false],

        // Output Level
        ["$out_warning","string,64", ""],

        // Internal Level
        ["$is_triggered_by_str","bool",false],
        ["$was_triggered_by_str","bool",false],
        ["$is_triggered_by_run","bool",false],

        // Constants
        ["$const_no_warning", "string", "all good"]
    ],
    "Input": [
        ["Current Warning", "", "$in_current_warning", "a"],
        ["Request Run", "", "$in_request_run", "a"]
    ],
    "Output": [
        ["Warning", "", "$out_warning", "a"]
    ],
  
    "Module": [
      [ "Triggered", "$in_current_warning", "$is_triggered_by_str" ],
      [ "Triggered", "$in_request_run", "$is_triggered_by_run" ],
      
      
      // str triggered, set str was triggered to true and break
      ["Latch","$true","$was_triggered_by_str","$is_triggered_by_str",0],
      ["Break", ["$is_triggered_by_str"]],

           
      // Send out warning if was triggered by str
      ["Latch","$in_current_warning","$out_warning","$was_triggered_by_str",0],

      // Send out no warning if was not triggered by str
      ["Latch","$const_no_warning","$out_warning","-$was_triggered_by_str",0],

      // Reset was triggered by str
      ["Latch","$false","$was_triggered_by_str","$was_triggered_by_str",0]
    ]
  }
Nutzungsrechte:
Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter https://wrgt.news/TOLL zum Download zur Verfügung steht.

Viele Grüße,
Matthias
Zuletzt geändert von blaubaerli am Do Dez 26, 2024 11:35 pm, insgesamt 1-mal geändert.
[ Timberwolf Entwicklung ]

TWS 2400 ID:102 VPN offen, Reboot auf Nachfrage
TWS 3500 ID:695 VPN offen, Bitte kein Reboot ohne Absprache

AndererStefan
Reactions:
Beiträge: 261
Registriert: Sa Mär 02, 2024 11:04 am
Hat sich bedankt: 138 Mal
Danksagung erhalten: 161 Mal

#2

Beitrag von AndererStefan »

Hallo Matthias,

das ist ja großartig! Und was für ein Zufall (ist es Zufall?!).
Ich war beim Abruf von Wetterdaten auf eine ähnliche Situation gestoßen, dass wenn’s nicht regnet, gar keine Regenmenge angegeben ist.(viewtopic.php?f=82&t=5635).

Ich hatte mal „mal eben schnell“ eine Logik versucht die aber nicht geklappt hat. Die Lösung von dir kommt daher just in time. :dance:

VG Stefan
TWS 3500XL ID:1486, VPN aktiv, Reboot nach Rücksprache

AndererStefan
Reactions:
Beiträge: 261
Registriert: Sa Mär 02, 2024 11:04 am
Hat sich bedankt: 138 Mal
Danksagung erhalten: 161 Mal

#3

Beitrag von AndererStefan »

Ich wollte mich eigentlich gar nicht mit Custom-Logiken auseinander setzen, aber mit der Vorlage von Matthias hat es mich gereizt den Code etwas anzupassen. Mein erster Kontakt mit Custom Logiken war auch einfacher als erwartet. :handgestures-thumbupright:

Hier daher eine Abwandlung, die es ermöglicht fehlende float-Daten bei einer HTTP-REST Abfrage durch einen Fehlwert zu ersetzen. Der Fehlwert kann gewählt werden, voreingestellt ist 0.0.

Bild

Ich benutze die Logik um beim Abruf der Wetterdaten von openweathermaps.com fehlende Messwerte für Regen (es gibt nur Daten wenn es regnet) durch 0.0 l/h zu ersetzen.

Code: Alles auswählen

 {
    
    "Level": [
        
        // Input Level
        ["$in_value","float",0.0],
        ["$in_request_run","bool",false],
        ["$in_error_value","float",0.0],

        // Output Level
        ["$out_value","float",0.0],

        // Internal Level
        ["$is_triggered_by_value","bool",false],
        ["$was_triggered_by_value","bool",false],
        ["$is_triggered_by_run","bool",false]

        // Constants
    ],
    "Input": [
        ["Value", "Eingangswert (float)", "$in_value", "a"],
        ["Trigger", "Trigger für Ausführung", "$in_request_run", "a"],
        ["Error Value", "Fehlerwert um Lücken zu füllen", "$in_error_value", "c"]
    ],
    "Output": [
        ["Value", "Eingabewert mit gefüllten Lücken (float)", "$out_value", "a"]
    ],
  
    "Module": [
      [ "Triggered", "$in_value", "$is_triggered_by_value" ],
      [ "Triggered", "$in_request_run", "$is_triggered_by_run" ],
      
      
      // str triggered, set str was triggered to true and break
      ["Latch","$true","$was_triggered_by_value","$is_triggered_by_value",0],
      ["Break", ["$is_triggered_by_value"]],

           
      // Send out value if was triggered by value
      ["Latch","$in_value","$out_value","$was_triggered_by_value",0],

      // Send out error value if was not triggered by value
      ["Latch","$in_error_value","$out_value","-$was_triggered_by_value",0],

      // Reset was triggered by value
      ["Latch","$false","$was_triggered_by_value","$was_triggered_by_value",0]
    ]
  }
"Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter https://wrgt.news/TOLL zum Download zur Verfügung steht."
TWS 3500XL ID:1486, VPN aktiv, Reboot nach Rücksprache
Antworten

Zurück zu „Zusätzliche Logikbausteine“