Gelöst: Finde den Fehler. Schalten abhängig vom Sender.

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Antworten
lomtas
Beiträge: 44
Registriert: 09.09.2012, 23:22
System: CCU
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Gelöst: Finde den Fehler. Schalten abhängig vom Sender.

Beitrag von lomtas » 06.04.2021, 14:19

Hi,

suche gerade einen Fehler in einem Script, aber finde ihn einfach nicht. Vielleicht habt ihr Ideen?
Es geht um das Schalten von Beleuchtung abhängig von der Außenhelligkeit und abhängig von einem Taster. Der Taster wird entweder kurz gedrückt, dann wird die Szene hell oder dunkel eingestellt je nach Außenhelligkeit, oder der Taster wird langgedrückt, dann wird die entsprechend andere Szene eingestellt.

Also: Kurzer Tastdruck: Draußen hell, Beleuchtung wenig, aber hell. Draußen dunkel, viel Ambientelicht und Hauptbeleuchtung dunkler.
Langer Tastendruck: Draußen hell, viel Ambienetelicht und Hauptbeleuchtung dunkler. Draußen dunkel, Beleuchtung wenig, aber hell.

Irgendwo in den Bedingungen mache ich anscheinend einen Fehler, finde ihn aber einfach nicht:

Code: Alles auswählen

if ((helligkeit > 180 && (source == null || source == "BidCos-RF.OEQ0163326:3.PRESS_SHORT")) || (helligkeit <=180 && source == "BidCos-RF.OEQ0163326:3.PRESS_LONG") ) {
	!Draußen hell
}

if ((helligkeit <= 180 && (source == null || source == "BidCos-RF.OEQ0163326:3.PRESS_SHORT")) || (helligkeit > 180 && source == "BidCos-RF.OEQ0163326:3.PRESS_LONG") ) {
	!draußen dunkel
}
hm. Jemand eine Idee?

Das ist bisher mein gesamtes Script zur Info:

Code: Alles auswählen

!Entscheidungsparameter
integer helligkeit = dom.GetObject("BidCos-RF.LEQ1245224:1.BRIGHTNESS").Value();

!Programmauslöser
string source = dom.GetObject("$src$").Name();

!Variablen für Aktoren
var esszimmerDeckenleuchte = dom.GetObject("BidCos-RF.MEQ0402311:1.LEVEL");
var indirektEsszimmer = dom.GetObject("BidCos-RF.JEQ0734218:1.LEVEL");
var indirektKueche = dom.GetObject("BidCos-RF.JEQ0733842:1.LEVEL");
var indirektWohnzimmer = dom.GetObject("BidCos-RF.OEQ0196131:1.LEVEL");
var ecksteckdoseWohnzimmer = dom.GetObject("BidCos-RF.OEQ0379629:1.STATE");
var downlightsKueche = dom.GetObject("BidCos-RF.OEQ0104875:1.LEVEL");
var deckenleuchteErker = dom.GetObject("BidCos-RF.MEQ0402390:1.LEVEL");
var wohnzimmerDecke = dom.GetObject("BidCos-RF.MEQ0401335:1.LEVEL");

if ((helligkeit > 180 && (source == null || source == "BidCos-RF.OEQ0163326:3.PRESS_SHORT")) || (helligkeit <=180 && source == "BidCos-RF.OEQ0163326:3.PRESS_LONG") ) {
	!Draußen hell
    if (esszimmerDeckenleuchte.Value() != 80) {	esszimmerDeckenleuchte.State(80); }
    if (indirektEsszimmer.Value() != 0) { indirektEsszimmer.State(0); }
    if (indirektKueche.Value() != 0){ indirektKueche.State(0); }
    if (indirektWohnzimmer.Value() != 0) { indirektWohnzimmer.State(0); }
	if (ecksteckdoseWohnzimmer.Value() != false) { ecksteckdoseWohnzimmer.State(false); }
	if (downlightsKueche.Value() != 0) { downlightsKueche.State(0); }
    if (deckenleuchteErker.Value() != 0) { deckenleuchteErker.State(0); }
	if (wohnzimmerDecke.Value() != 0) { wohnzimmerDecke.State(0); }
}

if ((helligkeit <= 180 && (source == null || source == "BidCos-RF.OEQ0163326:3.PRESS_SHORT")) || (helligkeit > 180 && source == "BidCos-RF.OEQ0163326:3.PRESS_LONG") ) {
	!draußen dunkel
    if (esszimmerDeckenleuchte.Value() != 65) {	esszimmerDeckenleuchte.State(65); }
    if (indirektEsszimmer.Value() != 22) { indirektEsszimmer.State(22); }
    if (indirektKueche.Value() != 15){ indirektKueche.State(15); }
    if (indirektWohnzimmer.Value() != 10) { indirektWohnzimmer.State(10); }
	if (ecksteckdoseWohnzimmer.Value() != true) { ecksteckdoseWohnzimmer.State(true); }
	if (downlightsKueche.Value() != 12) { downlightsKueche.State(12); }
    if (deckenleuchteErker.Value() != 0) { deckenleuchteErker.State(0); }
	if (wohnzimmerDecke.Value() != 0) { wohnzimmerDecke.State(0); }
}

[/size]
Zuletzt geändert von lomtas am 06.04.2021, 19:19, insgesamt 1-mal geändert.

MichaelN
Beiträge: 9646
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1615 Mal

Re: Finde den Fehler. Schalten abhängig vom Sender.

Beitrag von MichaelN » 06.04.2021, 14:36

Als erstes herausfinden welcher Term nicht den erwarteten Wert annimmt.
Klassisches Debugging halt.
Blacks SDV ist bei sowas hilfreich
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 +++

lomtas
Beiträge: 44
Registriert: 09.09.2012, 23:22
System: CCU
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Finde den Fehler. Schalten abhängig vom Sender.

Beitrag von lomtas » 06.04.2021, 15:03

Bin mit SDV unterwegs.

Habe schon versucht zu debuggen, aber war bisher eher erfolglos.
Du hast mich jetzt noch auf Idee gebracht. Habe folgenden Block noch eingefügt:

Code: Alles auswählen

if (helligkeit > 180 && (source == null || source == "BidCos-RF.OEQ0163326:3.PRESS_SHORT")) { WriteLine("1"); }
if (helligkeit <=180 && source == "BidCos-RF.OEQ0163326:3.PRESS_LONG") { WriteLine("2"); }
if (helligkeit <= 180 && (source == null || source == "BidCos-RF.OEQ0163326:3.PRESS_SHORT")) { WriteLine("3"); }
if (helligkeit > 180 && source == "BidCos-RF.OEQ0163326:3.PRESS_LONG") { WriteLine("4"); }
In der Ausgabe bekomme ich
1
4
d.h. die erste und die vierte Bedingung treffen zu, also
  • helligkeit > 180 && (source == null || source == "BidCos-RF.OEQ0163326:3.PRESS_SHORT"
  • (helligkeit > 180 && source == "BidCos-RF.OEQ0163326:3.PRESS_LONG"
Die Helligkeit ist bei 188, das passt also, aber für die source habe ich in SDV "BidCos-RF.OEQ0163326:3.PRESS_LONG" mitgegeben. Damit sollte die erste Bedingung eigentlich nicht zutreffen. Was läuft hier falsch?

(source == null hatte ich für den Test auch schon rausgenommen, ändert jedoch nichts am Verhalten)

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: Finde den Fehler. Schalten abhängig vom Sender.

Beitrag von dtp » 06.04.2021, 15:05

So auf den allerersten Blick würde ich da noch ein paar zusätzliche Klammern setzen:

Code: Alles auswählen

if(((helligkeit > 180) && ((source == null) || (source == "BidCos-RF.OEQ0163326:3.PRESS_SHORT"))) || ((helligkeit <=180) && (source == "BidCos-RF.OEQ0163326:3.PRESS_LONG"))){
  !Draußen hell
}

if(((helligkeit <= 180) && ((source == null) || (source == "BidCos-RF.OEQ0163326:3.PRESS_SHORT"))) || ((helligkeit > 180) && (source == "BidCos-RF.OEQ0163326:3.PRESS_LONG"))){
  !draußen dunkel
}
Aber ist "null" nicht ein String? Ich würde es dann auch eher so umschreiben, wobei ich mich frage, was du mit source = "null" überhaupt bezwecken willst:

Code: Alles auswählen

if((source == "null") || (source == "BidCos-RF.OEQ0163326:3.PRESS_SHORT") || (source == "BidCos-RF.OEQ0163326:3.PRESS_LONG")){
  if(helligkeit > 180){
    !Draußen hell
  }
  elseif(helligkeit <= 180){
    !Draußen dunkel
  }
}
Zudem liefert dir "string source = dom.GetObject("$src$").Name();" nicht den Output "BidCos-RF.OEQ0163326:3.PRESS_SHORT".

Mein Tipp: Arbeite nicht mit den Seriennummern der Geräte sondern mit den Klarnamen. So kannst du das später viel leichter zuordnen.

Hier nur mal eine Gedankenanregung. ;)

Code: Alles auswählen

source = dom.GetObject("$src$"); 
sourceName = (dom.GetObject(source.Channel())).Name();
sourceType = source.HssType();
sourceValue = source.Value();
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

lomtas
Beiträge: 44
Registriert: 09.09.2012, 23:22
System: CCU
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Finde den Fehler. Schalten abhängig vom Sender.

Beitrag von lomtas » 06.04.2021, 19:19

Vielen Dank für deine Hilfestellungen.

Welchen Output mir der Code für den Sender liefert habe ich per Systemvariable schon heute Mittag geprüft. Es ist genau der erwartete Code: BidCos-RF.OEQ0163326:3.PRESS_SHORT Somit kann ich den Fehler an dieser Stelle ausschließen.

Aus dem Forum habe ich verstanden, dass null der Wert ist, der in der Variable drin stehe, wenn das Programm ohne Auslöser gestartet wird (z.B. über den manuellen Aufruf aus einer App oder über das Webfrontend).

Es waren zum Schluss wirklich die Klammern. Das werde ich mir merken und habe viel gelernt. Vielen Dank.

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: Gelöst: Finde den Fehler. Schalten abhängig vom Sender.

Beitrag von dtp » 07.04.2021, 07:34

Ja, die korrekte Klammersetzung ist sehr wichtig bei verknüpften Bedingungen, zumal kein Syntax-Fehler oder dergleichen ausgespuckt wird, wenn man ein Klammerpaar vergessen hat.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Antworten

Zurück zu „HomeMatic allgemein“