Via CUxD-Exec geholte Werte nicht per IF vergleichbar (Datentyp falsch?)

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

Antworten
Wookbert
Beiträge: 224
Registriert: 10.05.2013, 18:40
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Via CUxD-Exec geholte Werte nicht per IF vergleichbar (Datentyp falsch?)

Beitrag von Wookbert » 17.02.2020, 05:34

Das nachstehende Script holt mir erfolgreich die Niederschlagsart mittels DarkSky API und CUxD.
DarkSky liefert "rain", "snow" oder "sleet" (jeweils mit Anführungszeichen) oder aber NULL (immer wenn die Niederschlagswahrscheinlichkeit bei 0% liegt).

Im Script wird nach Zeile A der Wert vom CUxD-Exec (s_cuxd = "CUxD.CUX2801001:1.") der geholte Wert (bspw. "rain" [inkl. Anführungszeichen] an den string Niederschlagsart_en übergeben.

Mein Problem ist nun, daß die IF-Bedingung unter Zeile C nicht funktioniert (obwohl keine Tippfehler drin sind), und deshalb "rain" nicht in Regen (ohne Anführungszeichen) übersetzt wird. Kommentiere ich jedoch den CUxD-Exec-Teil aus, und setzte den string Niederschlagsart_en = '"rain"' händisch (nach Zeile B), dann funktioniert die IF-Bedingung exakt wie sie soll.

A und B liefern per WriteLine rein optisch den gleiche Eingangswert für die IF-Bedingung: "rain".

Ich vermute einmal, daß der Typ/die Art des strings Niederschlagsart_en irgendwie verkehrt ist, und konvertiert werden muss. Nur wie!?

Code: Alles auswählen

string s_cuxd = "CUxD.CUX2801001:1.";
var DarkSkyURL = "'" # dom.GetObject('Wetter DarkSky URL').ValueList() # "'"; ! Wichtig für string s_cmd sind die einfachen Anführungszeichen, welche mit # verbunden werden (# = &), damit die URL mit Anführungszeichen gespeichert wird -> 'https://api.darksky.net...'
WriteLine("DarkSkyURL: " # DarkSkyURL # "\n") ! ### Debug-Ausgabe

! Aktuelle Niederschlagsart übergeben
string s_cmd = 'curl -sSf ' # DarkSkyURL # '| jq .currently.precipType';
dom.GetObject (s_cuxd # "CMD_SETS").State (s_cmd);
dom.GetObject (s_cuxd # "CMD_QUERY_RET").State (1);
! Zeile A
string Niederschlagsart_en = (dom.GetObject (s_cuxd # "CMD_RETS").State()); ! _en = englische Rohfassung aus dem CUxD holen
! Zeile B
! string Niederschlagsart_en = '"rain"'; ### DEBUG: Wert händisch gesetzt

! Ab hier wird Englisch zu Deutsch übersetzt (Niederschlagsart wird von DarkSky in Anführungszeichen geliefert also z.B. "rain")
! Zeile C
if ( Niederschlagsart_en=='"rain"' )  { string Niederschlagsart_de = "Regen"; }
if ( Niederschlagsart_en=='"snow"' )  { string Niederschlagsart_de = "Schnee"; }
if ( Niederschlagsart_en=='"sleet"' )  { string Niederschlagsart_de = "Graupelschauer"; }
else { Niederschlagsart_de = Niederschlagsart_en; } ! wenn NULL, dann NULL (DarkSky liefert keinen Wert bei 0% Wahrscheinlichkeit)
dom.GetObject ("Wetter Aktuelle Niederschlagsart").State(Niederschlagsart_de);

Wookbert
Beiträge: 224
Registriert: 10.05.2013, 18:40
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Via CUxD-Exec geholte Werte nicht per IF vergleichbar (Datentyp falsch?)

Beitrag von Wookbert » 17.02.2020, 06:58

Leck mich am Allerwertesten!!!

Mir ist eben aufgefallen, daß zwischen meinen WriteLine-Debugging-Ausgaben immer eine Leerzeile war. Daraufhin hat ein Gedanke in mir gebrodelt: Was ist, wenn "rain" nicht "rain", sondern "rain"+ein Zeilenumbruch ist?

Also per integer length = Niederschlagsart_en.Length(); mal die Länge gemessen. Und siehe da: 7 Zeichen statt der 6 sichtbaren! Den String Niederschlagsart_en in der IF-Bedingung um ein Zeichen gekürzt ... Bingo!

Jetzt frage ich mich natürlich: Wo kommt der bescheuerte Zeilenumbruch her? Und wie werde ich ihn am besten los?

Gibt es eine elegantere Lösung, als diese, die eine weitere Variable erfordert? (_en_raw ist hier die Version mit dem Zeilumbruch, _en die „gestrippte“).

Code: Alles auswählen

string Niederschlagsart_en_raw = (dom.GetObject (s_cuxd # "CMD_RETS").State()); ! _en = englische Rohfassung aus dem CUxD holen
string Niederschlagsart_en = Niederschlagsart_en_raw.Substr(0, Niederschlagsart_en_raw.Length()-1); ! Zeilenumbruch entfernen

Benutzeravatar
Black
Beiträge: 5483
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 424 Mal
Danksagung erhalten: 1074 Mal
Kontaktdaten:

Re: Via CUxD-Exec geholte Werte nicht per IF vergleichbar (Datentyp falsch?)

Beitrag von Black » 17.02.2020, 11:22

Joah... gibt es... die stringmethode .Trim ();
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“