Zitat von knxPaul
Beitrag anzeigen
Ankündigung
Einklappen
Keine Ankündigung bisher.
Neue Logikbausteine für den L1/X1: Formelberechnung, Statistik und mehr...
Einklappen
Dieser Beitrag wurde beantwortet.
X
X
-
Hallo an alle. Ich habe ein kleines Problem, wo wahrscheinlich viele sagen: "ach mensch, ist doch ganz easy..."
Ersteinmal auch vielen vielen dank hyman für die großartige Arbeit in Sachen XML/JSON Parser Baustein.
Genau hier habe ich eine Frage, da ich mit XPath nicht so vertraut bin.
Ich hole mir vom Volkszähler (Smartmeter) eine json Abfrage für aktuelle Leistung und eben Zählerstand. Leider schaffe ich es nicht, auch nach mehrfachen Suchen und Probiererein den korrekten Pfad im GPA einzugebe, dass das gewünschte Ergebnis bei rauskommt.
Code:{ "version": "0.3", "data": { "tuples": [ [ 1731844107517, 29342.295, 1 ] ], "uuid": "642b5f80-a338-11ef-a2f4-3bba738b84bf", "from": 1731844105518, "to": 1731844107517, "average": 0, "consumption": 0, "rows": 2 } }
Die Json Abfrage erfolgt mit dem Logikbaustein "Splendid Minds: Web-Requests senden", URL: http://10.10.2.10/middleware.php/dat...s=raw&from=now
ausgegeben wird hier o.g. Code im Browser.
Im GPA ist es ebenso, nur eben alle Zeichen hintereinander weg.
Am Ausgang des Bausteins hängt der Parser Baustein von hyman.
Ich habe es geschafft mit "/root/data/tuples" einen Wert zu bekommen, aber eben nicht genau diesen. Er wirft die gesamte Zahl, die in "tuples" enthalten sind aus. Ich brauche aber nur diesen einen Wert als Zahl.
Kann mir jemand helfen, wie ich es schaffe den Pfad und/oder weitere Einstellungen am Parserbaustein vorzunehmen, sodass ich die gewünschte Zahl als Ausgabe erhalte? Das wäre total super.
Ich danke euch im Voraus.
VG
BjörnZuletzt geändert von quake85; 17.11.2024, 13:04.
Kommentar
-
Zitat von hyman Beitrag anzeigenganz linke Spur ;-)
vielen Dank für diese Variante. Habe es ausprobiert und es funktioniert perfekt. In der Folge habe ich es aber ganz simpel gelöst "über kleiner und grösser mit IF THEN ELSE", um beide Varianten in einer Formel zu behandeln. Im aktuellen "NOT LIVE"-Test funktioniert es perfekt und ich werde nach Inbetriebnahme Ende Dezember berichten.
Danke Dir und Gruss André
- Likes 1
Kommentar
-
hyman
Hallo und Guten Morgen Horst,
ich habe ein Problem, bei dem ich gerade nicht weiter komme:
In der Formelberechnung habe ich diverse "Eingänge" vom Typ NUMBER. Als Beispiel ein Temperaturwert, der am Eingang "20,83" ist und am Ausgang der Formelberechung durch ein "Math.Round({Temp_Aussen:N},1)" den Wert "20,8" ausgibt. Soweit alles gut. Für Eingangs-Werte, die keine Dezimalstelle haben, hatte ich das noch mit "Math.Round({Temp_Aussen:N},1).ToString("N1")" ergönzt -> So wird aus "20" dann "20,0" - auch soweit alles gut.
Da ich diese Werte alle in einem JSON-String benötige und ich die Werte gerne als Zahlen hätte, ist für mich die Frage, wie ich aus dem "," einen Punkt "." machen kann.
Gerne würde ich mir im JS-Script nachher das Konvertieren sparen. Hast Du eine Idee?
Gruss André
Kommentar
-
Zitat von araeubig Beitrag anzeigennicht weiter komme
Danke Dir nochmal an dieser Stelle. Wenn ich Zeit und Musse habe, oder jemand speziell anfragt, werde ich die Datenbasis auf GitHub stellen.
Und wenn Fragen bezüglich der "coolen" Uhr kommen -> Nein ich gebe da keine Daten weiter. Wer im Web sorgfältig schaut, wird die originale Datenbasis finden. Warum ich nicht die richtige Uhr nehme? Weil der oben gezeigte Content auf einem 85" 8K-Signage-Display läuft und an der Wand damit "genug" ist. Die echte Uhr in ähnlicher Grösse kostet ein Vermögen und kann mir leider den anderen, gewünschten Content nicht anzeigen.
Und ja es sind noch einige ganz minimale CSS-Fehler drin. Das finale Video gibt es dann auch noch in den nächsten Wochen,Zuletzt geändert von araeubig; 27.01.2025, 15:37.
Kommentar
-
Zitat von araeubig Beitrag anzeigenGerne würde ich mir im JS-Script nachher das Konvertieren sparen. Hast Du eine Idee?
Kommentar
-
Zitat von hyman Beitrag anzeigenWenn die Zahl eh schon als Text vorliegt sollte das mit Replace gehen
Gruss André
Kommentar
-
Leider beiße ich mir gerade ein bisschen die Zähne aus mit dem Baustein.
Ich habe folgendes Szenario: Ich möchte einen ESP32 auf dem Wled läuft entsprechend auch aus der Gira X1 Oberfläche ansteuern.
Gewünscht sind AN/AUS, Das Farbrad im RGBW Dimmer und den Dimmwert.
An/Aus konnte ich über die Logik abbilden. Dazu lese ich den Wert des Schalters und schicke einen Webrequest über die wled http api ().
Für die Auswahl der Farben habe ich 4 virtuelle Datenpunkte im X1 definiert. Für Rot, Blau, Grün, Weiß.
Diesen versuche ich in das http-api format zu bekommen: http://192.168.178.126/win&R=255&G=50&B=150&W=0
"http://192.168.178.126/win&R="+{Rot:I}+"&G="+{Grün:I}+"&B="+{Blau:I}+"&W= "+{Weiß:I}:""
Das funktioniert für einen einzelnen Wert ohne Probleme:
"http://192.168.178.126/win&R="+{Rot:I}
Insgesamt geht es bis zu folgendem Punkt:
"http://192.168.178.126/win&R="+{Rot:I}+"&G"
Sobald ich an dem Punkt:
"http://192.168.178.126/win&R="+{Rot}+"&G=" ankomme lande ich in einem Fehler weil ich eine explizite Zuweisung mache, was nicht erlaubt ist.
Ich hab dann versucht über diverse Funktionen und workarounds das ganze irgendwie zu umgehen, z.B.
CONCAT("http://192.168.178.126/win&R=", {Rot:I}, "&G=", {Grün:I}, "&B=", {Blau:I}, "&W=", {Weiß:I})
oder die = doppelt zu klammern/separieren... +{Rot}+"&G"+"="
Leider erfolglos. Zum einen Verstehe ich nicht wieso die Zuweisung innerhalb eines Strings durchschlägt, zum anderen bin ich ratlos wie ich die 4 Werte in eine URL bekomme
image.png
Und für die Helligkeit stehe ich vor dem Problem, dass ich den Prozentwert aus dem RGBW Dimmer auf das Format (0-255) der wled api formatieren muss.
Das habe ich versucht mit einer Multiplikation in der Formel und einer entsprechenden Rundung.
Auch in diversen Konstellationen als 2,55f, ohne weiteren Typen etc.
"http://192.168.178.126/win&A="+(int)Math.Round(2,55f*{Helligkeit:I})
Hier lande ich dann bei:
Expression 3 (before character 45): error CS1502: The best overloaded method match for `System.Math.Round(double, int)' has some invalid arguments
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ms corlib.dll (Location of the symbol related to previous error)
Expression 3 (before character 53): error CS1503: Argument `#2' cannot convert `float' expression to type `int'
Oder ohne den type cast auf Int:
Expression 3 (before character 40): error CS0121: The call is ambiguous between the following methods or properties: `System.Math.Round(double, int)' and `System.Math.Round(decimal, int)'
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ms corlib.dll (Location of the symbol related to previous error)
Wie kann ich die korrekte Methode ansprechen um den Prozentwert für zB 100% nach 255 zu multiplizieren?
Bzw auch zB 50% als 127 zu übergeben (127,5 abgerundet nach unten)
Das konnte ich nun damit lösen, dass ich eine Variable als Skalingfaktor fix mit 2,55 definiert habe, statt 2,55 in der Formel zu verwenden:
"http://192.168.178.126/win&A="+Math.Floor({Scaleing:N}*{Helligkeit:I})Zuletzt geändert von Polytox; 06.05.2025, 13:01.
Kommentar
-
Zitat von Polytox Beitrag anzeigen"http://192.168.178.126/win&R="+{Rot:I}+"&G="+{Grün:I}+"&B="+{Blau:I}+"&W= "+{Weiß:I}:""
... Fehler weil ich eine explizite Zuweisung mache, was nicht erlaubt ist.
Zitat von Polytox Beitrag anzeigen... ratlos wie ich die 4 Werte in eine URL bekomme
...
Wie kann ich die korrekte Methode ansprechen um den Prozentwert für zB 100% nach 255 zu multiplizieren?
Kommentar
-
Das war tatsächlich noch ein Kopierfehler hier ins forum rein. Ich hatte davor eine Abfrage drin ob die Werte gefüllt sind und habe sonst einen leeren string übergeben. Das hab ich mittlerweile darüber angefangen, dass ich dann keinen triggern für den Web send schicke. Daher war dann der :"" nicht mehr notwendig weil ich keine if Abfrage mehr hatte.
Daran lags also nicht. Version prüfe ich morgen.. Es kann durchaus sein, dass ich da nicht die aktuelle im Gira hab.
Die Multiplikation hab ich ja wie oben beschrieben schon gelöst bekommen. Ob da jetzt ein int cast oder der math.floor schöner ist sei dahin gestellt.
Der Wert den Gira übergibt is. 0-100 als Anmerkung falls das mal Jemand braucht und hier drüber stolpert.Zuletzt geändert von Polytox; 06.05.2025, 17:39.
Kommentar
-
Folgende beiden Formeln, die Deinen Fall leicht vereinfacht abbilden, funktionieren bei mir:
Typ des Ausgangs 1: INTEGER
Typ des Ausgangs 2: TEXT
Formel 1: (int)({x:F} * 2.55)
Formel 2: "http://a.b.de/x&R=" + _out1_ + "&G=" + _out1_ + "&B=" + _out1_ + "&W=" + _out1_
grafik.png
Kommentar
-
Morgen hyman,
ich konnte das Problem nun lösen. Es gestaltet sich wie folgt (Ich habe es testweise dann erstmal auf eine Variable gekürzt:
"http://192.168.178.126/win&R="+{Rot}+"&G="+{Rot}+"&B="+{Rot}+"&W="+{Rot}
--> Zuweisung nicht erlaubt.
"http://192.168.178.126/win&R=" + {Rot} + "&G=" + {Rot} + "&B=" + {Rot} + "&W=" + {Rot}
--> Referenzfehler Rot unbekannt
---> Es scheint also einen Unterschied zu machen ob man +{VAR}+ oder + {VAR} + verwendet. Ich habe lange nicht mehr in einer richtigen Programmiersprache (C# länger als lang gearbeitet). Eventuell ist die Short-notation einfach syntaxsensitive.
Entsprechend ging es weiter mit:
"http://192.168.178.126/win&R=" + {Rot:I} + "&G=" + {Rot} + "&B=" + {Rot} + "&W=" + {Rot}
Eigentlich wird Rot schon als I im anderen Ausgang definiert.
und schlussendlich:
"http://192.168.178.126/win&R=" + {Rot:I} + "&G=" + {Grün:I} + "&B=" + {Blau:I} + "&W=" + {Weiß:I}
--> Klappt.
Eventuell hilft jemand die Erkenntnis mal jemand.
Ich habe gerade festgestellt, dass ich mir die Mühe hätte sparen können, da der Gira Color Picker den Rückkanal zwingend braucht...Das hatte knxPaul schonmal erklärt, nur hab ich das verdrängt. Ich bekomme jetzt zwar also Werte, aber nix korrektes, weil der Colorpicker Müll auswirft.
- Likes 1
Kommentar
-
Muss ich nochmal ausprobieren, was bei mir passiert, wenn ich die (eigentlich überflüssigen) Leerzeichen entferne ..
.Zitat von Polytox Beitrag anzeigenEigentlich wird Rot schon als I im anderen Ausgang definiert.
Kommentar
Kommentar