"Licht aus"-Varianten mit variablem Delay?
Moderator: Co-Administratoren
-
- Beiträge: 544
- Registriert: 17.04.2021, 17:12
- System: CCU
- Hat sich bedankt: 27 Mal
- Danksagung erhalten: 123 Mal
Re: "Licht aus"-Varianten mit variablem Delay?
Hallo Roland
Freut mich, daß es Dir gefällt.
Sehe aber gerade:
Die Definition für x im foreach - Statement muss doch
als string definiert werden.
also string x ; ! Kanalname/
statt var x; ! Kanalname/
Das hatte ich aus meinem Test-Script nicht übernommen.
Und eine Gegenprobe auch bestätigt.
Gruß
Harry
Freut mich, daß es Dir gefällt.
Sehe aber gerade:
Die Definition für x im foreach - Statement muss doch
als string definiert werden.
also string x ; ! Kanalname/
statt var x; ! Kanalname/
Das hatte ich aus meinem Test-Script nicht übernommen.
Und eine Gegenprobe auch bestätigt.
Gruß
Harry
Gruß
Harry
Harry
-
- Beiträge: 9656
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 697 Mal
- Danksagung erhalten: 1617 Mal
Re: "Licht aus"-Varianten mit variablem Delay?
Tatsächlich ist es bei dieser Skript Sprache (meist) egal, weil der Typ einfach angepasst wird. Ich würde aber aus Prinzip schon den richtigen Typ verwenden. Blacks SDV zeigt das in seiner aktuellen Version übrigens schön an, wenn sich der Typ beim Durchlauf ändert.
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 +++
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 +++
-
- Beiträge: 544
- Registriert: 17.04.2021, 17:12
- System: CCU
- Hat sich bedankt: 27 Mal
- Danksagung erhalten: 123 Mal
Re: "Licht aus"-Varianten mit variablem Delay?
Ja ist eine Eigenart. Kann dann auch zu unerwarteten Ergebnissen führen.
Aber laut Handbuch : Die Indexvariable selbst muss zwingend eine Zeichenkette sein.
Mein Test ergab auch, als var deklariert, wird das Script nicht ausgeführt.
Gruß
Harry
Aber laut Handbuch : Die Indexvariable selbst muss zwingend eine Zeichenkette sein.
Mein Test ergab auch, als var deklariert, wird das Script nicht ausgeführt.
Gruß
Harry
Gruß
Harry
Harry
-
- Beiträge: 544
- Registriert: 17.04.2021, 17:12
- System: CCU
- Hat sich bedankt: 27 Mal
- Danksagung erhalten: 123 Mal
Re: "Licht aus"-Varianten mit variablem Delay?
Hallo Roland
Ich noch mal.
Ich habe festgestellt, daß "channels" wohl ein geschütztes Schlüsselwort ist. Das Script läuft so nicht. Hast Du evtl. aber
auch schon festgestellt.
Daher anbei eine korrigierte Version:
Als Entschuldigung noch ein kleines Script, was aus in Frage kommenden Gewerken die Kanäle ausliest
und daraus Definitionsstatements für die kanalliste erstellt. Da kannst Du Dir die entsprechenden Zeilen rauskopieren oder löschen.
(ich finde das Eintippen immer lästig .. )
gewerke = ("Licht;Steckdosen") natürlich auf Deine ändern.
Gruß
Harry
Ich noch mal.
Ich habe festgestellt, daß "channels" wohl ein geschütztes Schlüsselwort ist. Das Script läuft so nicht. Hast Du evtl. aber
auch schon festgestellt.
Daher anbei eine korrigierte Version:
Code: Alles auswählen
var d = 0; ! delay
string x; ! Kanalname/
var dp; ! Datenpunkt des Kanals
var kanalliste="";
! #### Keller ####
! ---- Werkstatt ----
kanalliste = kanalliste # "Steckdosen Werkstatt:3]STATE";
kanalliste = kanalliste # "[Licht Werkstatt Decke:3]LEVEL";
! ---- Vorraum Keller / Dusche / WC ----
kanalliste = kanalliste # "[Licht Dusche:1]STATE";
kanalliste = kanalliste # "[Licht WC Keller:1]STATE";
kanalliste = kanalliste # "[Waschmaschine:3]STATE";
kanalliste = kanalliste # "[Wäschetrockner:3]STATE";
foreach(x, kanalliste.Split("["))
{
if (!dp) { continue ;} !falsche Eingabe
dp = dom.GetObject(x.StrValueByIndex("]", 0)).DPByHssDP(x.StrValueByIndex("]", 1));
if (dp.Value() > 0)
{
dp.State(0, d);
d = d + 1000;
}
}
Als Entschuldigung noch ein kleines Script, was aus in Frage kommenden Gewerken die Kanäle ausliest
und daraus Definitionsstatements für die kanalliste erstellt. Da kannst Du Dir die entsprechenden Zeilen rauskopieren oder löschen.
(ich finde das Eintippen immer lästig .. )
Code: Alles auswählen
string ix;
var list = "*NONE";
var gewerke = ("Licht;Steckdosen");
var info = '!************* Gewerk XXXXXXX *************;\n';
var GW = "";
foreach(ix, gewerke.Split(";"))
{
var gewerk = dom.GetObject(ix);
string i;
string STLVL = "STATE";
GW = info;
if (gewerk)
{
foreach(i, gewerk.EnumUsedIDs())
{
var channel = dom.GetObject(i);
var dev = dom.GetObject(channel.Device());
dev = ' ! Kanal vom Gerät ' # dev # '\n';
string id;
foreach(id, channel.DPs())
{
var dp = dom.GetObject(id);
STLVL = "*NONE";
if (dp.Name().EndsWith(".STATE"))
{
STLVL = "STATE";
break;
}
elseif(dp.Name().EndsWith(".LEVEL"))
{
STLVL = "LEVEL";
break;
}
};
if (STLVL <> "*NONE")
{
if (list == "*NONE")
{
list = 'var kanalliste="";\n';
list = list # GW;
list = list # 'kanalliste = kanalliste #"' # channel # ']' # STLVL # '";' # dev;
}
else
{
list = list # GW;
list = list # 'kanalliste = kanalliste #"[' # channel # ']' # STLVL # '";' # dev;
}
GW = "";
}
}
list = list.Replace("XXXXXXX", gewerk.ToString());
}
}
WriteLine(list);
Gruß
Harry
Gruß
Harry
Harry
- Roland M.
- Beiträge: 9787
- Registriert: 08.12.2012, 15:53
- System: CCU
- Wohnort: Graz, Österreich
- Hat sich bedankt: 252 Mal
- Danksagung erhalten: 1374 Mal
Re: "Licht aus"-Varianten mit variablem Delay?
Hallo!
Noch eine abschließende Bemerkung zum mittlerweile umgesetzten Projekt.
Nachdem sich die Programmierung "leicht" verzögert hat, da sich die kleine Aufgabe "Neutralleiter für HM-Schaltaktor nachziehen" in die große Aufgabe "halben Keller neu verkabeln" gewandelt hat und ich dabei den meisten Pfusch aus dem Jahr 1972 behoben habe (ohne allerdings abgehängte Holzdecken, Wandvertäfelungen und Gipskartonplatten zu zerstören, da liegen noch ein paar Leichen versteckt...), konnte ich jetzt Harrys Script-Lösung mit umsetzen. Nur zwei Dinge haben mir Kopfzerbrechen bereitet.
1.
Die Funktionsweise der Zeile...
...ist mir nicht klar, leider auch über die Suche nichts gefunden.
Beim ersten Durchlauf ist der Datenpunkt ja noch gar nicht bestimmt, also false. Was macht das "continue"?
Wenn es zur nächsten Iteration der foreach-Schleife springt, wie ich vermute, ist im nächsten Durchgang der Datenpunkt ja wieder nicht bestimmt.
Zeile weggelassen, Script funktioniert auf meiner Test-Raspberrymatic.
2.
Script 1:1 in das Produktivsystem aufgenommen, funktioniert nicht.
Nach einigem Probieren und schrittweisem Testen bin ich zum Schluss gekommen, dass unter der CCU2 (!) die Zeile...
...nicht funktioniert und einfach ignoriert wird.
Trennt man das dagegen auf...
...läuft das Script auch auf der CCU2.
Da wird wohl irgend ein Stack zu klein sein...
Das Script triggere ich nun beim Wechsel der Abwesenheits-SV, bei Abwesenheit werden bereits 13 Kanäle in 9 Geräten ausgeschaltet, ein analoges Script schaltet bei Anwesenheit auch wieder 5 Kanäle/Geräte ein (bzw. werden sie wieder in Betriebsbereitschaft gesetzt).
Einem weiteren Ausbau steht also abgesehen von Zeit, Geld und weiteren elektrotechnischen Überraschungen nichts mehr im Weg!
Danke nochmals an alle Beteiligten, allen voran Harry!
Roland
Noch eine abschließende Bemerkung zum mittlerweile umgesetzten Projekt.
Nachdem sich die Programmierung "leicht" verzögert hat, da sich die kleine Aufgabe "Neutralleiter für HM-Schaltaktor nachziehen" in die große Aufgabe "halben Keller neu verkabeln" gewandelt hat und ich dabei den meisten Pfusch aus dem Jahr 1972 behoben habe (ohne allerdings abgehängte Holzdecken, Wandvertäfelungen und Gipskartonplatten zu zerstören, da liegen noch ein paar Leichen versteckt...), konnte ich jetzt Harrys Script-Lösung mit umsetzen. Nur zwei Dinge haben mir Kopfzerbrechen bereitet.
1.
Die Funktionsweise der Zeile...
Code: Alles auswählen
if (!dp) { continue; }
Beim ersten Durchlauf ist der Datenpunkt ja noch gar nicht bestimmt, also false. Was macht das "continue"?
Wenn es zur nächsten Iteration der foreach-Schleife springt, wie ich vermute, ist im nächsten Durchgang der Datenpunkt ja wieder nicht bestimmt.
Zeile weggelassen, Script funktioniert auf meiner Test-Raspberrymatic.
2.
Script 1:1 in das Produktivsystem aufgenommen, funktioniert nicht.
Nach einigem Probieren und schrittweisem Testen bin ich zum Schluss gekommen, dass unter der CCU2 (!) die Zeile...
Code: Alles auswählen
dp = dom.GetObject(x.StrValueByIndex("]", 0)).DPByHssDP(x.StrValueByIndex("]", 1));
Trennt man das dagegen auf...
Code: Alles auswählen
var k = x.StrValueByIndex("]", 0);
var s = x.StrValueByIndex("]", 1);
dp = dom.GetObject(k).DPByHssDP(s);
Da wird wohl irgend ein Stack zu klein sein...
Das Script triggere ich nun beim Wechsel der Abwesenheits-SV, bei Abwesenheit werden bereits 13 Kanäle in 9 Geräten ausgeschaltet, ein analoges Script schaltet bei Anwesenheit auch wieder 5 Kanäle/Geräte ein (bzw. werden sie wieder in Betriebsbereitschaft gesetzt).
Einem weiteren Ausbau steht also abgesehen von Zeit, Geld und weiteren elektrotechnischen Überraschungen nichts mehr im Weg!
Danke nochmals an alle Beteiligten, allen voran Harry!
Roland
Zur leichteren Hilfestellung bitte unbedingt beachten:
-----------------------------------------------------------------------
1. CCU2 mit ~100 Geräten (in Umstellung auf RaspberryMatic-OVA auf Proxmox-Server)
2. CCU2 per VPN mit ~50 Geräten (geplant: RaspberryMatic auf Charly)
3. CCU2 per VPN mit ~40 Geräten (geplant: RaspberryMatic auf CCU3)
CCU1, Test-CCU2, Raspi 1 mit kleinem Funkmodul, RaspberryMatic als VM unter Proxmox, Access Point,...
- Bezeichnung (HM-... bzw. HmIP-...) der betroffenen Geräte angeben (nicht Artikelnummer)
- Kurzbeschreibung des Soll-Zustandes (Was soll erreicht werden?)
- Kurzbeschreibung des Ist-Zustandes (Was funktioniert nicht?)
- Fehlermeldungen genau abschreiben, besser noch...
- Screenshots von Programmen, Geräteeinstellungen und Fehlermeldungen (direkt als jpg/png) einstellen!
-----------------------------------------------------------------------
1. CCU2 mit ~100 Geräten (in Umstellung auf RaspberryMatic-OVA auf Proxmox-Server)
2. CCU2 per VPN mit ~50 Geräten (geplant: RaspberryMatic auf Charly)
3. CCU2 per VPN mit ~40 Geräten (geplant: RaspberryMatic auf CCU3)
CCU1, Test-CCU2, Raspi 1 mit kleinem Funkmodul, RaspberryMatic als VM unter Proxmox, Access Point,...
-
- Beiträge: 544
- Registriert: 17.04.2021, 17:12
- System: CCU
- Hat sich bedankt: 27 Mal
- Danksagung erhalten: 123 Mal
Re: "Licht aus"-Varianten mit variablem Delay?
Hallo Roland
Du hast Recht. continue springt zum Ende der Schleife und macht dann mit dem nächsten Durchlauf weiter.(break verlässt die Schleife)
Ist natürlich an der Stelle fehl am Platz und hätte 2 Zeilen weiter gekonnt.
aber da ist dann ja auch schon if (dp.Value() > 0)...
Ich benutze continue gerne, wenn innerhalb einer Schleife viele Statements bei falschen Bedingungen übersprungen werden sollen.
Ich finde das übersichtlicher.
Kann auch sein das diese Konstruktion :
auch gar nicht so funktioniert.
Vielen Dank für Deine Rückmeldung.
Und hat mir auch Spass gemacht.
Gruß
Harry
Du hast Recht. continue springt zum Ende der Schleife und macht dann mit dem nächsten Durchlauf weiter.(break verlässt die Schleife)
Ist natürlich an der Stelle fehl am Platz und hätte 2 Zeilen weiter gekonnt.
aber da ist dann ja auch schon if (dp.Value() > 0)...
Code: Alles auswählen
if (!dp) { continue ;} !falsche Eingabe
dp = dom.GetObject(x.StrValueByIndex("]", 0)).DPByHssDP(x.StrValueByIndex("]", 1));
if (dp.Value() > 0)
Ich finde das übersichtlicher.
Kann auch sein das diese Konstruktion :
Code: Alles auswählen
dp = dom.GetObject(x.StrValueByIndex("]", 0)).DPByHssDP(x.StrValueByIndex("]", 1));
Vielen Dank für Deine Rückmeldung.
Und hat mir auch Spass gemacht.
Gruß
Harry
Gruß
Harry
Harry
- Roland M.
- Beiträge: 9787
- Registriert: 08.12.2012, 15:53
- System: CCU
- Wohnort: Graz, Österreich
- Hat sich bedankt: 252 Mal
- Danksagung erhalten: 1374 Mal
Re: "Licht aus"-Varianten mit variablem Delay?
Hallo Harry!
Roland
Doch, doch, prinzipiell funktioniert das schon, aber eben nur auf der Raspberrymatic, nicht aber auf der CCU2 (eine originale 3er hab ich nicht zur Verfügung).Tyfys hat geschrieben: ↑16.06.2021, 17:33Kann auch sein das diese Konstruktion :
auch gar nicht so funktioniert.Code: Alles auswählen
dp = dom.GetObject(x.StrValueByIndex("]", 0)).DPByHssDP(x.StrValueByIndex("]", 1));
Roland
Zur leichteren Hilfestellung bitte unbedingt beachten:
-----------------------------------------------------------------------
1. CCU2 mit ~100 Geräten (in Umstellung auf RaspberryMatic-OVA auf Proxmox-Server)
2. CCU2 per VPN mit ~50 Geräten (geplant: RaspberryMatic auf Charly)
3. CCU2 per VPN mit ~40 Geräten (geplant: RaspberryMatic auf CCU3)
CCU1, Test-CCU2, Raspi 1 mit kleinem Funkmodul, RaspberryMatic als VM unter Proxmox, Access Point,...
- Bezeichnung (HM-... bzw. HmIP-...) der betroffenen Geräte angeben (nicht Artikelnummer)
- Kurzbeschreibung des Soll-Zustandes (Was soll erreicht werden?)
- Kurzbeschreibung des Ist-Zustandes (Was funktioniert nicht?)
- Fehlermeldungen genau abschreiben, besser noch...
- Screenshots von Programmen, Geräteeinstellungen und Fehlermeldungen (direkt als jpg/png) einstellen!
-----------------------------------------------------------------------
1. CCU2 mit ~100 Geräten (in Umstellung auf RaspberryMatic-OVA auf Proxmox-Server)
2. CCU2 per VPN mit ~50 Geräten (geplant: RaspberryMatic auf Charly)
3. CCU2 per VPN mit ~40 Geräten (geplant: RaspberryMatic auf CCU3)
CCU1, Test-CCU2, Raspi 1 mit kleinem Funkmodul, RaspberryMatic als VM unter Proxmox, Access Point,...
-
- Beiträge: 544
- Registriert: 17.04.2021, 17:12
- System: CCU
- Hat sich bedankt: 27 Mal
- Danksagung erhalten: 123 Mal
Re: "Licht aus"-Varianten mit variablem Delay?
Hallo Roland
Hat mir doch keine Ruhe gelassen, weil ich meinte , daß das auf meiner CCU2 lief.
und siehe da:
statt :
mussten noch jeweils ein Klammernpaar extra gesetzt werden:
das hatte ich leider vergessen.
Gruß
Harry
Hat mir doch keine Ruhe gelassen, weil ich meinte , daß das auf meiner CCU2 lief.
und siehe da:
statt :
Code: Alles auswählen
dp = dom.GetObject(x.StrValueByIndex("]", 0)).DPByHssDP(x.StrValueByIndex("]", 1));
Code: Alles auswählen
dp = dom.GetObject((x.StrValueByIndex("]", 0))).DPByHssDP((x.StrValueByIndex("]", 1)));
Gruß
Harry
Gruß
Harry
Harry