Autor Beitrag
Sweeny
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Sa 05.08.23 16:43 
Hallo zusammen,

ich will einen Logikbaustein für den Abruf von Tibber-Strompreisen (Stromanbieter) in einem bestimmten Smart-Home-System entwickeln.
Ich bin fast fertig, aber irgendwie funktioniert der CURL-Abruf nicht (Besonderheit: Tibber nutzt GraphQL. Ich weiß, CURL ist nicht die beste Wahl, aber aufgrund der Beschränkungen des SDK/der Software kann ich nichts anderes verwenden (eine Diskussion darüber bringt leider nicht viel).

Es ist alles nur ein Ausschnitt...

Das Problem: Irgendwie komme ich mit den Backslashes etc. nicht zu recht. Es wird von der API nichts zurückgegeben; ich glaube, ich habe irgendwo einen "Syntax"-Fehler eingebaut.

Hat da jemand eine Idee für mich? Ich bin ziemlicher Anfänger, mit GraphQL habe ich noch nie etwas gemacht.

In Postman habe ich das alles schon zum Laufen bekommen.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
private static string DownloadByCurl(string str)
        {
            Process process = new Process();
            process.StartInfo.FileName = "curl";
            process.StartInfo.Arguments = str;
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError = true;
            process.StartInfo.CreateNoWindow = true;
            process.StartInfo.StandardOutputEncoding = Encoding.UTF8;
            process.Start();
            string end = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            return end;
        }

        public override void Execute()
        {
            if (this.Trigger.WasSet && this.Trigger.Value)
            {
                try
                {
                    string url = "-H 'Authorization: Bearer " + this.Token + "' -H 'Content-Type: application/json' -X POST --data-raw '{\"query\":\"{ viewer { homes { currentSubscription { priceInfo { current { total energy tax startsAt } } } } } }\"}' https://api.tibber.com/v1-beta/gql";
                    string get = DownloadByCurl(url);

                    this.Fehler.Value = string.Empty;
                    this.Output.Value = get;
                    this.Output2.Value = url;
                }
...


Offiziell schreibt TIBBER (Token ist natürlich nur ein Demotoken):
Zitat:
curl \
-H "Authorization: Bearer 5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE" \
-H "Content-Type: application/json" \
-X POST \
-d '{ "query": "{viewer {homes {currentSubscription {priceInfo {current {total energy tax startsAt }}}}}}" }' api.tibber.com/v1-beta/gql

Viele Grüße

Alex

Moderiert von user profile iconTh69: Quote-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 05.08.23 17:35 
> Ich weiß, CURL ist nicht die beste Wahl, aber aufgrund der Beschränkungen des SDK/der Software kann ich nichts anderes verwenden (eine Diskussion darüber bringt leider nicht viel).

Du solltest uns aber nicht einfach so neugierig zurücklassen. Wie kann ein SDK verhindern das ein stinknormaler, bereits im Framework enthaltener, Http Client nicht geht sondern nur Curl? Die Tibber Doku schreibt selbst man soll irgendeinen Http Client nehmen. Vielleicht benennst du das SDK genauer dann habe ich/wir eine Idee von den Rahmenbedingungen.

Bist du auf C#11? Dann versuche die an einem raw string.

Sieht am Ende so aus
ausblenden C#-Quelltext
1:
var cmd= $$""meineLiebeKommandozeileMitWenigerHochkommataAmStückAlsDieserTextGequotestIst"";					

dann brauchst du nicht überlegen wie " escaped werden müssen.
Sweeny Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Sa 05.08.23 19:39 
Ja, gerne mehr Infos.

Der proprietäre Gira X1 ist das System selbst, darauf läuft MONO (Version 4.0.2). Erweiterungen (Logik-Bausteine) kann man in c# entwickeln, ein SDK liefert Gira mit. Knackpunkt: Derzeit kann man nur eine TLS-Verschlüsselung für Webabfragen aus diesen Logikbausteinen bis TLS 1.1 aufbauen. Ja, ich weiß, es sind aber eben auch wirklich nur die Aufrufe aus diesen Bausteinen heraus :-).
Workaround ist allerdings, dass man über CURL Verbindungen auch mit TLS 1.2 aufbauen kann, man verlässt quasi die obengenannte Beschränkung für Logikbausteine.

Es ist laut Doku unbedingt erforderlich, dass in den Einstellungen des Projekts zum Logikbaustein das Target framework ".NET Framework 4.5" oder ".NET Framework 4.0" ausgewählt ist. Empfohlen wird zudem Visual Studio 2017, nutze ich auch.

Moderiert von user profile iconTh69: URL mit Titel zusammengefaßt.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 08.08.23 12:03 
Curl sollte etwas aus StandardOut schreiben wenn da syntaktisch was nicht stimmt. Läuft dein Code in Visual Studio wenn du ein Curl für Windows installiert hast? Ansonsten ist das hier primär raten was auf deinem Zielsystem passiert. Curl ist auch nicht immer gleich Curl. Möglicherweise ist die Variante auf dem System anders bzw. eingeschränkt.