Aktuelle Lichtstimmung in Variable schreiben, später abrufen

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

Moderator: Co-Administratoren

davidmuc
Beiträge: 105
Registriert: 15.08.2010, 00:27
Hat sich bedankt: 1 Mal

Re: Aktuelle Lichtstimmung in Variable schreiben, später abr

Beitrag von davidmuc » 23.02.2013, 19:55

Lieber Anli, nachdem ich geschäftlich unterwegs war, habe ich endlich wieder Zeit, an diesem kleinen Projekt weiterzuarbeiten. Wir sind nah' dran, ein kleiner Fehler tritt aber noch auf:

Wenn ich das Script wie von Dir geschrieben ausführe, werden nur die drei folgenden Dimmer als Variable ausgegeben:

Code: Alles auswählen

true;20687,0.950000,0.950000
true;20687,0.950000,0.950000;2493,1.000000,1.000000
true;20687,0.950000,0.950000;2493,1.000000,1.000000;4586,0.500000,0.500000
Diese drei Empfänger sind alle vom Typ HM-LC-Dim1L-Pl, d.h. im Script funktioniert der zweite Teil, der erste Teil mit dem oder ist fehlerhaft:

WriteLine("###### START ######");
var licht = dom.GetObject("Licht");
var sysVarHK = dom.GetObject("Testvariable");
var s = sysVarHK.State("");
var statusaktuell = "";
var statusccu = "";
string itemID;
foreach(itemID, licht.EnumUsedIDs())
{
var item = dom.GetObject(itemID);

if (item.IsTypeOf(OT_CHANNEL)) {
var devid = item.Device();
var dev = dom.GetObject(devid);
string hsst = dev.HssType();
if (hsst == "HM-LC-Sw1-Pl" || hsst == "HM-LC-Sw1-FM" || hsst == "HM-LC-Sw2-FM" || hsst == "HM-LC-Sw1-PB-FM")
{
s = s # ";" # item.ID() # "," # item.DPByHssDP("STATE").State() # ","# item.DPByHssDP("STATE").Value();
statusaktuell = statusaktuell # ";"# item.DPByHssDP("STATE").State();
statusccu = statusccu # ";"# item.DPByHssDP("STATE").Value();
WriteLine(s);
}
if (hsst == "HM-LC-Dim1L-Pl")
{
s = s # ";" # item.ID() # "," # item.DPByHssDP("LEVEL").State() # ","# item.DPByHssDP("LEVEL").Value();
statusaktuell = statusaktuell # ";"# item.DPByHssDP("LEVEL").State();
statusccu = statusccu # ";"# item.DPByHssDP("LEVEL").Value();
WriteLine(s);
}
}
}
sysVarHK.State(s);
WriteLine("###### VARIABLEN ######");
WriteLine(s);
WriteLine(statusaktuell);
WriteLine(statusccu);
WriteLine("###### ENDE ######");
}
Der Fehler liegt definitiv an der oder-Auflistung (mit || getrennt), denn als ich im zweiten "Dimmer"-Teil einen zweiten Dimmer-Typ eingefügt habe...
if (hsst == "HM-LC-Dim1L-Pl" || hsst == "HM-LC-Dim1T-Pl")
...hat das Script gar keine Werte mehr geliefert.

Natürlich könnte man für jeden Typ eine eigene if-Schleife schreiben, aber es muss doch eine einfachere Alternative für's oder geben?!

Konzeptionelle will ich hierhin: Man richtet sich eine schöne Lichtstimmung ein, indem man die Lampen individuell dimmt. Langer Tastendruck auf eine dedizierte Taste speichert dann diese Stimmung in der Variablen. Mit einem kurzem Tastendruck kann man diese Stimmung dann jederzeit wieder abrufen ;-)

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: Aktuelle Lichtstimmung in Variable schreiben, später abr

Beitrag von anli » 23.02.2013, 21:00

Hm, das || ist laut Doku ok. Nun denn:

Code: Alles auswählen

var b = 1;
var c = 2;
if ((b == 1) || (c == 2) || true)
{
  WriteLine("Hallo Welt");
}
funktioniert. Insofern probiere bitte einmal

Code: Alles auswählen

if ((hsst == "HM-LC-Sw1-Pl") || (hsst == "HM-LC-Sw1-FM") || (hsst == "HM-LC-Sw2-FM") || (hsst == "HM-LC-Sw1-PB-FM"))
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

davidmuc
Beiträge: 105
Registriert: 15.08.2010, 00:27
Hat sich bedankt: 1 Mal

Re: Aktuelle Lichtstimmung in Variable schreiben, später abr

Beitrag von davidmuc » 23.02.2013, 21:09

anli hat geschrieben:...probiere bitte einmal

Code: Alles auswählen

if ((hsst == "HM-LC-Sw1-Pl") || (hsst == "HM-LC-Sw1-FM") || (hsst == "HM-LC-Sw2-FM") || (hsst == "HM-LC-Sw1-PB-FM"))

...wohow! Nun funktioniert's! Schade, das hatte ich nicht probiert. DANKE! Teil 1 ist geschafft: Nun haben wir alle Werte in der Variablen und ich mache mich mal an's Werk, die wieder auszulesen.

davidmuc
Beiträge: 105
Registriert: 15.08.2010, 00:27
Hat sich bedankt: 1 Mal

Re: Aktuelle Lichtstimmung in Variable schreiben, später abr

Beitrag von davidmuc » 23.02.2013, 23:18

Bevor ich mich an's Auslesen der Variable und Setzen der Lichtstimmung mache, wollte ich das Script noch aufräumen. Um den "Funkverkehr" zu reduzieren und das Script performanter zu machen, möchte ich statt des jew. State des Gerätes "nur" den in der CCU gespeicherten Value auslesen - das müsste ja ökonomischer sein und schneller gehen.

Bei den Schaltern klappt das prima, bei den Dimmern nicht. So ausgeführt, wie es unten steht, erhalte ich die schöne Variable:

Code: Alles auswählen

;20687,1.000000,1.000000;2493,1.000000,1.000000;6630,true;1497,true;13544,true;4548,1.000000,1.000000;6879,true;4586,0.500000,0.500000;6636,false;6329,false
d.h. die Dimmer immer mit ID und zwei Werten (ID,State,Value), die Schalter mit ID und an/aus (ID,t/f)

Wenn ich versuche, den State im markierten Teil zu entfernen:
WriteLine("###### START ######");
var licht = dom.GetObject("Licht");
var sysVarHK = dom.GetObject("Testvariable");
var s = sysVarHK.State("");
var s = "";
string itemID;
foreach(itemID, licht.EnumUsedIDs())
{
var item = dom.GetObject(itemID);
if (item.IsTypeOf(OT_CHANNEL)) {
var devid = item.Device();
var dev = dom.GetObject(devid);
string hsst = dev.HssType();
if ((hsst == "HM-LC-Sw1-Pl") || (hsst == "HM-LC-Sw1-FM") || (hsst == "HM-LC-Sw2-FM") || (hsst == "HM-LC-Sw1-PB-FM"))
{
s = s # ";" # item.ID() # "," # item.DPByHssDP("STATE").Value();
WriteLine(s);
}
if ((hsst == "HM-LC-Dim1L-Pl") || (hsst == "HM-LC-Dim1T-Pl"))
{
s = s # ";" # item.ID() # "," # item.DPByHssDP("LEVEL").State() # "," # item.DPByHssDP("LEVEL").Value();
WriteLine(s);
}
}
}
sysVarHK.State(s);
WriteLine("###### VARIABLEN ######");
WriteLine(s);
WriteLine("###### ENDE ######");
}
dann erhalte ich im HM Script Executor als Ergebnis INVALID JSON. Die Variable wird aber trotzdem ordentlich - mit nur einem Wert bei den Dimmern - gesetzt!

JSON Ausgabe:
STDOUT {}Error parsing response <xml><exec>/tclrega.exe</exec><sessionId></sessionId><httpUserAgent></httpUserAgent><licht>Licht</licht><sysVarHK>Testvariable</sysVarHK><s>;20687,1.000000;2493,1.000000;6630,true;1497,true;13544,true;4548,1.000000;6879,true;4586,0.500000;6636,false;6329,false</s<itemID>6329</itemID><item>Stern Decke</item><devid>6306</devid><dev>Stern Decke</dev><hsst>HM-LC-Sw1-PB-FM</hsst></xml>
Das verstehe ich nicht.

P.S.: Wo kann man Dir was spenden?! ;-)

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: Aktuelle Lichtstimmung in Variable schreiben, später abr

Beitrag von anli » 25.02.2013, 15:20

Das Problem ist, dass die XML-Rückgabe nicht wellformed ist - hinter dem 329,false</s fehlt das >. Würde ich erstmal ignorieren, da es ja nur für die Wiedergabe im Skripteditor genutzt wird (welchen nutzt Du da? Eventuell auf "meinen" unten verlinkten updaten).

Code: Alles auswählen

STDOUT {}Error parsing response <xml><exec>/tclrega.exe</exec><sessionId></sessionId><httpUserAgent></httpUserAgent><licht>Licht</licht><sysVarHK>Testvariable</sysVarHK><s>;20687,1.000000;2493,1.000000;6630,true;1497,true;13544,true;4548,1.000000;6879,true;4586,0.500000;6636,false;6329,false</s<itemID>6329</itemID><item>Stern Decke</item><devid>6306</devid><dev>Stern Decke</dev><hsst>HM-LC-Sw1-PB-FM</hsst></xml>
davidmuc hat geschrieben:P.S.: Wo kann man Dir was spenden?! ;-)
Grundsätzlich mache ich das unentgeltlich. Wenn Du jedoch das Bedürfnis hast, mir ein Trinkgeld zu geben, kann ich Dir gerne meine Paypal-Adresse senden :mrgreen:
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

davidmuc
Beiträge: 105
Registriert: 15.08.2010, 00:27
Hat sich bedankt: 1 Mal

Re: Aktuelle Lichtstimmung in Variable schreiben, später abr

Beitrag von davidmuc » 25.02.2013, 16:43

anli hat geschrieben:(...)Skripteditor genutzt wird (welchen nutzt Du da? Eventuell auf "meinen" unten verlinkten updaten)
Aber selbstverständlich arbeite ich mit dem! :-)

Antworten

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