Fehlerhafte Auswertung von ChnDirection() in verketteten if-Bedingungen

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Antworten
Ingo23
Beiträge: 3
Registriert: 23.01.2024, 08:41
System: Alternative CCU (auf Basis OCCU)

Fehlerhafte Auswertung von ChnDirection() in verketteten if-Bedingungen

Beitrag von Ingo23 » 23.01.2024, 09:09

Hallo zusammen,

ich bin heute über ein merkwürdinges Verhalten beim Auswerten der ChnDirection gestoßen (Raspimatic 3.73.9.20231130):
In einer Schleife iteriere ich über alle Objekte vom Typ "Verschluss", um für eine Textmeldung die Gerätenamen zu sammeln.
Üblicherweise hat bei mir nur der Sender-Kanal den Typ Verschluss. Nun hatten sich Fensterkontakte eingeschlichen, bei denen nicht nur der Senderkanal, sondern auch der nicht-verknüpfbare Kanal 0 als "Verschluss" gekennzeichnet waren.
Daher habe ich die Schleife mit einer Abfrage auf ChnDirection == 1 (also Sender) ergänzt.
Allerdings tauchen immer noch die Einträge der Nuller-Kanäle (mit ChnDirection == 0) mit auf.

Etwas hin- und herprobieren hat ergeben, das die Position innerhalb der Bedingungen darüber bestimmt, ob diese Abfrage funktioniert.
Das Schnipsel sieht so aus:

Code: Alles auswählen

var sensors = dom.GetObject("Verschluss");
string list;
string i;
foreach(i, sensors.EnumUsedIDs()) {
  var item = dom.GetObject(i);
  if ((item.IsTypeOf(OT_CHANNEL)) &&
      (item.ChnDirection() == 1) &&
      (item.DPByHssDP("STATE").Value() != 0)) {
    var device = dom.GetObject(item.Device());
    string device_name = device.Name();
    WriteLine(">> " # item.Name() # " > " # item.ChnDirection());
  }
}
Ändert man jetzt die Reihenfolge wie folgt, dann funktioniert es.

Code: Alles auswählen

  if ((item.ChnDirection() == 1) &&
      (item.IsTypeOf(OT_CHANNEL)) &&
      (item.DPByHssDP("STATE").Value() != 0)) {
Änderungen von == 1 auf != 0 oder > 0 funktionieren ebenso wenig (und wäre aber auch kein gleichwertiger Ersatz).

Habe ich etwas übersehen?
Über die Sprachbeschreibung und die Forensuche haben bisher nichts gefunden.

Viele Grüße
Ingo
Zuletzt geändert von Roland M. am 23.01.2024, 11:05, insgesamt 1-mal geändert.
Grund: Thema verschoben

MichaelN
Beiträge: 9807
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 711 Mal
Danksagung erhalten: 1656 Mal

Re: Fehlerhafte Auswertung von ChnDirection() in verketteten if-Bedingungen

Beitrag von MichaelN » 24.01.2024, 19:54

Ingo23 hat geschrieben:
23.01.2024, 09:09
Habe ich etwas übersehen?
ChnDirection() ist vom Typ String
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Ingo23
Beiträge: 3
Registriert: 23.01.2024, 08:41
System: Alternative CCU (auf Basis OCCU)

Re: Fehlerhafte Auswertung von ChnDirection() in verketteten if-Bedingungen

Beitrag von Ingo23 » 24.01.2024, 20:54

Hallo Michael,

Danke für Deine Antwort!
Du hast Recht, im Gegensatz zur Objektmodellbeschreibung (HM Script Teil 2 v1.2, §6.1 und §6.7) ergibt VarType() tatsächlich 4 (String).

Was mich allerdings wundert: Selbst mit einem String scheint im Normalfall(?) der Vergleich zu funktionieren. Gilt die dynamische Typbindung auch in Verbindung mit Vergleichoperatoren?

Der folgende Schnipsel z.B. gibt 4 (String) als Typ aus und "integer 12"

Code: Alles auswählen

string s = "12";
WriteLine(s.VarType());
if (s == 12) {
  WriteLine("integer 12");
} elseif (s == "12") {
  WriteLine("string 12");
}
Jetzt frage ich mich funktioniert das nur zufällig (undefiniertes Verhalten?) oder steckt da System hinter?

Und gibt es irgendwo eine korrekte Doku zum Objektmodell oder ein Errata? Wie machst Du (macht ihr) das? Try and Error?

Viele Grüße
Ingo

Benutzeravatar
Baxxy
Beiträge: 11027
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 631 Mal
Danksagung erhalten: 2284 Mal

Re: Fehlerhafte Auswertung von ChnDirection() in verketteten if-Bedingungen

Beitrag von Baxxy » 24.01.2024, 21:00

Warum nimmst du nicht einfach die 0er Kanäle aus "Verschluss" raus?
Und wenn du diszipliniert nur die Statuskanäle in "Verschluss" hast kannst du dir gleich noch die Prüfung auf "ist es ein Kanal?" sparen.

MichaelN
Beiträge: 9807
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 711 Mal
Danksagung erhalten: 1656 Mal

Re: Fehlerhafte Auswertung von ChnDirection() in verketteten if-Bedingungen

Beitrag von MichaelN » 24.01.2024, 21:06

Ingo23 hat geschrieben:
24.01.2024, 20:54
oder steckt da System hinter?
Es wird immer von rechts nach links berechnet, inklusive Typ Wandlung.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Ingo23
Beiträge: 3
Registriert: 23.01.2024, 08:41
System: Alternative CCU (auf Basis OCCU)

Re: Fehlerhafte Auswertung von ChnDirection() in verketteten if-Bedingungen

Beitrag von Ingo23 » 25.01.2024, 09:23

Hallo Baxxy,
Hallo Michael,

ja, so ist es jetzt auch; ich hatte die Verschlüsse gleich aufgeräumt.
Allerdings lässt mich das Problem nicht in Ruhe, da ich es nicht verstehe.

Selbst wenn ich es auf einen String-Vergleich umbaue, rutschen "nicht-Sender" mit rein.
Allerdings nur in bestimmten Konstellationen:

Code: Alles auswählen

  if (true &&
      (item.ChnDirection() == "1") &&
      (item.DPByHssDP("STATE").Value() != 0)) {
Der Ausdruck liefert true für ChnDirection() == 0. (Oben stand der unnötige Check auf OT_Channel)

Code: Alles auswählen

  if (
      (item.ChnDirection() == "1") &&
      (item.DPByHssDP("STATE").Value() != 0)) {
Der Ausdruck liefert false für ChnDirection() == 0.

Irgendwie stehe ich wohl auf dem Schlauch... :-)

Viele Grüße,
Ingo

alchy
Beiträge: 10761
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 675 Mal

Re: Fehlerhafte Auswertung von ChnDirection() in verketteten if-Bedingungen

Beitrag von alchy » 25.01.2024, 19:20

Es bietet sich an, vielleicht die Nuller Kanäle mittels .HssType() oder anderem aus der Geschichte zu nehmen

Code: Alles auswählen

(!item.HssType() == "MAINTENANCE" ) 
und zu dem Rest Herrn Maus zu befragen. :wink:

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

[sprotte80]
Beiträge: 338
Registriert: 05.10.2020, 18:37
System: CCU
Hat sich bedankt: 30 Mal
Danksagung erhalten: 25 Mal

Re: Fehlerhafte Auswertung von ChnDirection() in verketteten if-Bedingungen

Beitrag von [sprotte80] » 25.01.2024, 20:06

Hi
Ingo23 hat geschrieben:
25.01.2024, 09:23
Irgendwie stehe ich wohl auf dem Schlauch... :-)
easy!
Der Channel 0 hat nich nen Dp 'STATE' daher knallts im if bei dem Teil

Code: Alles auswählen

(item.DPByHssDP("STATE").Value() != 0))
Is nen 'stiller ScriptRuntimeError' wo nix im Log steht

Heist auf deutsch
die &&-Verknüpfung wird nich ausgewertet und dan gehts halt nich ins if

Code: Alles auswählen

    (item.ChnDirection() == "0") && (item.DPByHssDP("STATE").Value() != 0))
Hier wird auch die lezte &&-Verkünpfung nich ausgewertet.
übrig bleibt true
daher gehts ins if

Code: Alles auswählen

   true && (item.ChnDirection() == "0") && (item.DPByHssDP("STATE").Value() != 0))
Thomas
Wenn du keine App zur Bedienung brauchst, dann hast du kein Smarthome, sondern nur eine angefangene Baustelle, oder nur ein unsmartes Autohome.

Homematic-Script - ScriptLexikon für alle
Methoden Konstanten
Hilfe und Infos erwünscht. Alle können mitmachen. Keine Levels. Keine Geheimtuerei.

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“