API Connector

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • akwa86
    Azubi
    • 10.01.2023
    • 8

    #1

    API Connector

    Hallo zusammen,

    ich bräuchte mal wieder eure Hilfe.

    Zuerst schildere ich mal den aktuellen Zustand.
    Ich habe meinen Stromanbieter gewechselt, bei dem mein stündlicher Verbrauch vom Zähler an den Anbieter übermittelt und abgerechnet wird. Wenn der akutelle Strompreis bspw. in der aktuellen Stunde bei 25ct. liegt und ich 2kwh verbrauche, kostet mich das 50ct.

    Ich habe im Haus an 3 Stellen RBGW Bänder die mir bisher immer die Außentemperatur angezeigt haben. LED´s sind Grün, Außentemperatur beträgt etwa 20 Grad. LED´s sind Weiß, Außentemperatur beträgt etwa 2 Grad.

    Jetzt möchte ich das alles auf den Strompreis umprogrammieren. Wenn Strompreis unter 25ct., alle LED´s auf Grün und so weiter.

    Aktuell hänge ich an einer Stelle fest:

    Mein Pythonscript sendet eine Query an meinen Anbieter per GraphQL und fragt den aktuellen Strompreis ab und speichert ihn in cp = current_price['total']
    ​Der Wert wird an einen Virtuellen Texteingang gesendet, welcher an einem Status Baustein am AC hängt. f"/dev/sps/io/SET(Sta;I1;{cp})

    Wenn ich das Script ausführe, sehe ich auch, das der Virtuelle Texteingang den Befehl erhalten hat. Aber wieso erkennt der Status Baustein diesen nicht am I1?
    Wo habe ich einen Denkfehler? Muss ich den Wert irgendwie anders an den Miniserver senden?


    importrequests
    fromrequests.authimportHTTPBasicAuth



    # GraphQL-Endpunkt und Zugriffstoken
    graphql_endpoint = "https://api.tibber.com/v1-beta/gql"
    access_token = "xxxxxxxxxxxxxxxxxxxxxxx"
    # GraphQL-Abfrage für den aktuellen Strompreis
    query = """
    {
    viewer {
    homes {
    currentSubscription {
    status
    priceInfo {
    current {
    total
    energy
    tax
    startsAt
    }
    }
    }
    }
    }
    }
    """
    # HTTP-Anfrage an den GraphQL-Endpunkt senden
    headers = {
    "Authorization": f"Bearer {access_token}",
    "Content-Type": "application/json"
    }
    response = requests.post(graphql_endpoint, json={"query": query}, headers=headers)
    # Antwort überprüfen und Daten verarbeiten
    ifresponse.status_code == 200:
    data = response.json()
    current_price = data["data"]["viewer"]["homes"][0]["currentSubscription"]["priceInfo"]["current"]
    cp = current_price['total']
    cp = int(cp * 100)
    print(cp)
    else:
    print(f"Fehler bei der Anfrage: {response.status_code}")
    print(response.text)





    local_url= "http://1X0.X17.129.X33/"
    serial_number = "XXXXXX"
    username = "XXX"
    password = "XXXXX"
    #Put the name of your Virtual Text Input between the ""
    virtual_text_input = "Strompreis"
    basic = HTTPBasicAuth(username,password)
    external_url = f"http://dns.loxonecloud.com/{serial_number}"
    resolved_external_url = (requests.get(external_url)).url
    command_base = f"dev/sps/io/{virtual_text_input}/"

    send_value = f"SET(Sta;I1;{cp})"
    #Execute a command on the local network
    defexecute_local_command(command):
    command = local_url + command_base + command
    returnprint(requests.get(command,auth =basic))

    execute_local_command(send_value)
    #Execute a command with remote connect
    defexecute_local_command(command):
    command = resolved_external_url + command_base + command
    returnprint(requests.get(command,auth =basic))




    Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Screenshot 2023-08-01 112535.png
Ansichten: 1196
Größe: 24,5 KB
ID: 398697
  • <Andreas>
    LoxBus Spammer
    • 07.03.2023
    • 285

    #2
    Ich habe zwar keine Ahnung vom API connector und mehr input hierzu ist nie verkehrt

    Aber du könntest alternativ den Strompreis von Python Script doch einfach z.B. als http Eingang übergeben, dann ist er überall in der Config einfach zu verwenden

    Bzw. warum hast du für diese Aufgabe den API connector gewählt?
    ​​​

    Kommentar

    • akwa86
      Azubi
      • 10.01.2023
      • 8

      #3
      Warum einfach, wenn es auch schwer geht. 🤭

      Das werde ich mal ausprobieren, danke dir.

      Warum den AC?
      Ich kenne mich mit der Loxone Programmierung Null aus, daher dachte ich, das wäre der richtige Weg, den Miniserver so offen wie möglich zu "steuern".
      Aber generell wäre es mal interessant, ob ich mit dem API Connector solche Werte übergeben könnte.

      Kommentar

      • <Andreas>
        LoxBus Spammer
        • 07.03.2023
        • 285

        #4
        Alternativ könntest du noch über die Websockets direkt auf einen virtuellen Eingang gehen, quick and dirty ist hald http oder udb
        Viele gehen auch den Umweg über mqtt des Loxberry

        Den Api connector gibt es noch nicht so lange, ich habe noch keine praktische Anwendung hier gefunden

        Kommentar

        • akwa86
          Azubi
          • 10.01.2023
          • 8

          #5
          HTTP Request funktioniert auch nicht.

          Ich kann mir den Wert zwar auf einer HTML Seite über localhost:5000 anzeigen lassen, aber Loxone liest nichts ein.

          Klicke auf die Grafik für eine vergrößerte Ansicht

Name: 13.png
Ansichten: 947
Größe: 13,1 KB
ID: 398836



          importrequests
          fromflaskimportFlask
          # GraphQL-Endpunkt und Zugriffstoken
          graphql_endpoint = "https://api.tibber.com/v1-beta/gql"
          access_token = "xxxxxxxxxxxxxxxxxxxxxx"
          # GraphQL-Abfrage für den aktuellen Strompreis
          query = """
          {
          viewer {
          homes {
          currentSubscription {
          status
          priceInfo {
          current {
          total
          energy
          tax
          startsAt
          }
          }
          }
          }
          }
          }
          """
          app = Flask(__name__)
          @app.route('/', methods=['GET'])
          defhome():
          # HTTP-Anfrage an den GraphQL-Endpunkt senden
          headers = {
          "Authorization": f"Bearer {access_token}",
          "Content-Type": "application/json"
          }
          response = requests.post(graphql_endpoint, json={"query": query}, headers=headers)
          # Antwort überprüfen und Daten verarbeiten
          ifresponse.status_code == 200:
          data = response.json()
          current_price = data["data"]["viewer"]["homes"][0]["currentSubscription"]["priceInfo"]["current"]
          cp = current_price['total']
          else:
          cp = "Fehler bei der Anfrage: " + str(response.status_code)
          # HTML-Code direkt in Python generieren
          html_content = f"""
          <!DOCTYPE html>
          <html>
          <head>
          <title>Strompreis</title>
          </head>
          <body>
          <h1>Aktueller Strompreis:</h1>
          <span>Tibber: {cp}</span>
          </body>
          </html>
          """
          returnhtml_content
          if__name__ == '__main__':
          app.run(port=5000, debug=True)


          Klicke auf die Grafik für eine vergrößerte Ansicht

Name: 11.png
Ansichten: 955
Größe: 5,8 KB
ID: 398834
          Klicke auf die Grafik für eine vergrößerte Ansicht

Name: 12.png
Ansichten: 942
Größe: 4,5 KB
ID: 398835

          Kommentar

        • akwa86
          Azubi
          • 10.01.2023
          • 8

          #6
          Hab das Script jetzt nochmal angepasst und es auf eine aws maschine geworfen.
          Jetzt holt er sich den Preis von dort. Hat jetzt alles bisschen gedauert, aber es läuft

          Danke dir für deinen Input Klicke auf die Grafik für eine vergrößerte Ansicht

Name: IMG-20230802-WA0004.jpg
Ansichten: 956
Größe: 682,7 KB
ID: 398860

          Kommentar


          • <Andreas>
            <Andreas> kommentierte
            Kommentar bearbeiten
            Schaut toll aus
        • EdiB
          Extension Master
          • 30.12.2015
          • 135

          #7
          Hallo
          Ich hänge mich jetzt mal da rein. Ich möchte z.B. aus dem Licht Zentral Baustein herausbekommen, wie viele Lichtkreise an sind oder besser noch welche. Ausgänge gibt es dafür ja keine. Ist das vielleicht über den API Connector (AC) möglich? Die Dokumentation ist entweder sehr dürftig, ich verstehe es nicht, oder es geht damit wirklich nicht. Klar kann ich mir die gewünschte Information auch irgendwie anders zusammen basteln. Aber ich kann mir nicht vorstellen, dass der Licht Zentral Baustein meine gewünschten Infos nicht herausgeben kann. Dasselbe mit dem Energy Manager. Wie bringe ich die Info, wie viele Verbraucher eingeschaltet sind, oder auch noch welche heraus. Der Baustein weiss es ja und zeigt es in der Visu auch an.
          Der Grund für mein Anliegen ist, dass ich die Werte in einem anderen System überführen, sprich an den MQTT Broker senden will.
          Besten Dank

          Kommentar


          • maximilian2202
            maximilian2202 kommentierte
            Kommentar bearbeiten
            Der API-Verbindet ermöglicht „nur“ Direktzugriff auf auf die Bausteinanschlüsse.

            Zumindest in der Theorie.

            Daten an einen Bausteinanschluss senden funktioniert halbwegs zuverlässig wobei es da bei Zahlen Probleme mit der Typconversion zu geben scheint.
            Und der Zugriff Bausteinansclüsse rückzulesen scheint noch nicht zu funktionieren obwohl es in der Dokumentation beschrieben ist.

            Von Loxone gibt’s noch ein interessantes webinar. Da wird das auch mit den GET Befehlen gesagt, zumindest für die „Alpha“ Version des API-Connectors.


          • maximilian2202
            maximilian2202 kommentierte
            Kommentar bearbeiten
            Aber wenn immer mal Leute bei Loxone nachfragen tut sich vielleicht mal wieder was bei der Entwicklung.

            Die Möglichkeiten sind nämlich echt super. So kann man mit einer Drittanwendung direkt an einem Baustein senden und Anwendungen einfach auslagern.
        Lädt...