"Licht aus"-Varianten mit variablem Delay?

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Tyfys
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?

Beitrag von Tyfys » 29.05.2021, 00:01

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
Gruß
Harry

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

Re: "Licht aus"-Varianten mit variablem Delay?

Beitrag von MichaelN » 29.05.2021, 00:50

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 +++

Tyfys
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?

Beitrag von Tyfys » 29.05.2021, 08:18

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
Gruß
Harry

Tyfys
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?

Beitrag von Tyfys » 30.05.2021, 20:06

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:

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 .. :mrgreen: )

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);
gewerke = ("Licht;Steckdosen") natürlich auf Deine ändern.



Gruß
Harry
Gruß
Harry

Benutzeravatar
Roland M.
Beiträge: 9784
Registriert: 08.12.2012, 15:53
System: CCU
Wohnort: Graz, Österreich
Hat sich bedankt: 252 Mal
Danksagung erhalten: 1373 Mal

Re: "Licht aus"-Varianten mit variablem Delay?

Beitrag von Roland M. » 16.06.2021, 16:39

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...

Code: Alles auswählen

if (!dp) { continue; }
...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...

Code: Alles auswählen

dp = dom.GetObject(x.StrValueByIndex("]", 0)).DPByHssDP(x.StrValueByIndex("]", 1));
...nicht funktioniert und einfach ignoriert wird.

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);
...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! :D

Danke nochmals an alle Beteiligten, allen voran Harry!


Roland
Zur leichteren Hilfestellung bitte unbedingt beachten:
  • 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,...

Tyfys
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?

Beitrag von Tyfys » 16.06.2021, 17:33

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)...

Code: Alles auswählen

    if (!dp)  {  continue ;}  !falsche Eingabe
    dp = dom.GetObject(x.StrValueByIndex("]", 0)).DPByHssDP(x.StrValueByIndex("]", 1));
    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 :

Code: Alles auswählen

dp = dom.GetObject(x.StrValueByIndex("]", 0)).DPByHssDP(x.StrValueByIndex("]", 1));
auch gar nicht so funktioniert.

Vielen Dank für Deine Rückmeldung.

Und hat mir auch Spass gemacht.


Gruß
Harry
Gruß
Harry

Benutzeravatar
Roland M.
Beiträge: 9784
Registriert: 08.12.2012, 15:53
System: CCU
Wohnort: Graz, Österreich
Hat sich bedankt: 252 Mal
Danksagung erhalten: 1373 Mal

Re: "Licht aus"-Varianten mit variablem Delay?

Beitrag von Roland M. » 16.06.2021, 17:47

Hallo Harry!
Tyfys hat geschrieben:
16.06.2021, 17:33
Kann auch sein das diese Konstruktion :

Code: Alles auswählen

dp = dom.GetObject(x.StrValueByIndex("]", 0)).DPByHssDP(x.StrValueByIndex("]", 1));
auch gar nicht so funktioniert.
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).


Roland
Zur leichteren Hilfestellung bitte unbedingt beachten:
  • 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,...

Tyfys
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?

Beitrag von Tyfys » 04.07.2021, 19:59

Hallo Roland

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));
mussten noch jeweils ein Klammernpaar extra gesetzt werden:

Code: Alles auswählen

dp = dom.GetObject((x.StrValueByIndex("]", 0))).DPByHssDP((x.StrValueByIndex("]", 1)));
das hatte ich leider vergessen.

Gruß
Harry
Gruß
Harry

Antworten

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