aktiven Aktor finden

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

BDO
Beiträge: 73
Registriert: 14.07.2017, 13:27
Hat sich bedankt: 26 Mal
Danksagung erhalten: 1 Mal

aktiven Aktor finden

Beitrag von BDO » 17.11.2021, 15:51

Hallo Wissende,
wieder mal eine Hilfe wäre super!
Situation:
12 Aktoren 3xHM-LC-Sw4-WM (Gewerk „AB“).
einer steht auf „on“
Ziel:
Die Seriennummer dieses Aktors und seinen offenen Kanal finden

Entdeckt hierzu habe ich im Forum:

Code: Alles auswählen

var sec=dom.GetObject("BA");
string item;
string i;
foreach(i,sec.EnumUsedIDs())
   {
    var item=dom.GetObject(i);
    if(item.IsTypeOf(OT_CHANNEL))
      {
       var dev=dom.GetObject(item.Device());
       if(dev.HssType()=="HM-LC-Sw4-WM")
         {
           dom.GetObject("BidCos-RF."#item.Address()#".STATE").State(false);
         }      
      }
   }
Hänge hier aber fest. Wer hat ein Script das helfen kann?
Zuletzt geändert von alchy am 17.11.2021, 21:17, insgesamt 1-mal geändert.
Grund: Code in Codetags posten
Gruß Boris

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: aktiven Aktor finden

Beitrag von Tyfys » 18.11.2021, 14:21

Hallo Boris

Ich weiss nicht genau, was du damit meinst ?
BDO hat geschrieben:
17.11.2021, 15:51
seinen offenen Kanal finden
Probiers mal so festzustellen, welcher Kanal in deinem Gewerk an ist (true).

Code: Alles auswählen

var sec = dom.GetObject("BA");
string item;
string i;
foreach(i, sec.EnumUsedIDs())
{
    var item = dom.GetObject(i);
    if (item.IsTypeOf(OT_CHANNEL))
    {
        var dev = dom.GetObject(item.Device());
        if (dev.HssType() == "HM-LC-Sw4-WM")
        {
            WriteLine("Schaltzustand:  " # item.State());
            WriteLine("Serien-Nummer:  " # item.Address().StrValueByIndex(":", 0));
            WriteLine("Kanal-Nummer:   " # item.ChnNumber());
            WriteLine("Serien+Kanal:   " # item.Address());
            !wenn an ist 
            if ( item.State() == true )   
            {
            ! dann mach dies und das 
            ! zB  so aus 
            ! item.State(false)
            ! oder so
            ! dom.GetObject("BidCos-RF." # item.Address() # ".STATE").State(false);
            }
        }
    }
}
Mir ist noch aufgefallen:
BDO hat geschrieben:
17.11.2021, 15:51
(Gewerk „AB“).

schreibst du zwar, aber im Skript dann var sec=dom.GetObject("BA");


Hoffe, das hilft dir weiter.
Gruß
Harry

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

Re: aktiven Aktor finden

Beitrag von Baxxy » 18.11.2021, 14:54

Ah, jetzt verstehe ich's.
Es sind ja nur 3 Aktoren mit insgesamt 12 Kanälen.
Wenn wirklich nur die 12 Schaltkanäle im Gewerk sind könnte man sich 2 if-Runden sparen.
Ansonsten sieht das (wie immer) gut aus Harry! :)

Grüße, Baxxy

BDO
Beiträge: 73
Registriert: 14.07.2017, 13:27
Hat sich bedankt: 26 Mal
Danksagung erhalten: 1 Mal

Re: aktiven Aktor finden

Beitrag von BDO » 18.11.2021, 17:15

Danke für die Resonanz.
Es geht mir darum, die Adresse eines “aktiven“ Aktors zu finden, der sich innerhalb des Gewerks “BA“ mit 3xHM-LC-Sw4-WM befinden kann. Das Script erledigt die Aufgabe, ist aber ziemlich langsam. Schön wäre es, wenn der Durchlauf abgebrochen wird, sobald der erste Aktor gefunden wurde. Leider fehlt mir noch das Know-how diesen Schleifendurchlauf abzubrechen. Sicher für einen “Wissenden“ kein größeres Problem?

Code: Alles auswählen

var bpo;
var i = dom.GetObject("BA");
string itemID;
foreach(itemID, i.EnumUsedIDs()) 
{
    var item = dom.GetObject(itemID);
    if (item.IsTypeOf(OT_CHANNEL)) 
    {
        var device = dom.GetObject(item.Device());
if ((device.HssType().Find("HM-LC-Sw") >= 0) && (item.State())) { bpo = item.Address(); }
}}
dom.GetObject("SV_adr").State(bpo).ToString();
}}
Wenn kein “aktiver“ Aktor gefunden wird, ist die “SV_adr“ leer. Frage hierzu:
Kann ich für die nächsten Schritte die SV mit

Code: Alles auswählen

 if (dom.GetObject("SV_adr").State(bpo).ToString();) {…} 

dann abfragen oder gibt es eine andere Methode?
Und noch eine Frage: wie kann ich die vorgenannte Datei später leeren?
Schon mal vorab vielen Dank für Euer Wissen.
Zuletzt geändert von alchy am 18.11.2021, 18:28, insgesamt 1-mal geändert.
Grund: Code in Codetags posten
Gruß Boris

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: aktiven Aktor finden

Beitrag von Tyfys » 18.11.2021, 18:25

Hallo Boris

Vorweg einmal was anderes.
Du solltest die eigentlichen Skriptzeilen in CodeTags setzen. Lässt sich besser lesen. Und längere Skripts nehmen auch nicht soviel Platz
auf dem Bildschirm weg.
Oberhalb des Texteingabefeldes den Button "</>" anklicken.


Aber nun zu deinen Fragen...

Wie Baxxy schon angedeutet hat, kann das ganze verkürzt werden, wenn sich in dem Gewerk "BA" auch NUR deine HM-LC-Sw4-WM befinden:

Code: Alles auswählen

var bpo;
var i = dom.GetObject("BA");
string itemID;
foreach(itemID, i.EnumUsedIDs())
{
    var item = dom.GetObject(itemID);
        if (item.DPByHssDP("STATE").Value())
        {
            bpo = item.Address();
            break;
        }
}
WriteLine(bpo.Type());
string seriennr = "Die  SerienNr ist: " # bpo;
WriteLine( seriennr);

if (bpo <>"" ) 
{
WriteLine("Aktor gefunden");
!oder mach was
}
else
{
WriteLine("kein Aktor gefunden");
!oder mach was anderes.
}
Die Anweisung break bewirkt das Verlassen der Schleife. (zB nach dem ersten Fund)
Es gibt auch continue - da wird nur der Rest der Schleife übersprungen .
mit quit kannst du sogar das Skript verlassen.

Die ermittelte Serien-Nr. ist von Haus aus vom Typ String. - To.String() ist also unnötig.

Du kannst die Skriptvariable bpo abfragen wie gezeigt.
Natürlich auch in ein Systemvariable übertragen.

Was meinst du mit
BDO hat geschrieben:
18.11.2021, 17:15
wie kann ich die vorgenannte Datei später leeren?
Zuletzt geändert von Tyfys am 18.11.2021, 21:05, insgesamt 2-mal geändert.
Gruß
Harry

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

Re: aktiven Aktor finden

Beitrag von Baxxy » 18.11.2021, 18:27

So langsam solltest du aber mal die Codes in Codetags posten. (Code anzeigen </>) :roll:
BDO hat geschrieben:
18.11.2021, 17:15
Das Script erledigt die Aufgabe, ist aber ziemlich langsam
Ich glaube...

Code: Alles auswählen

WriteLine("Schaltzustand:  " # item.State());
...fragt jeden Kanal aktiv ab statt die gespeicherten Werte der Zentrale zu nehmen. Das dauert natürlich und ist auch nicht DC freundlich.
"Besser" wäre wohl...

Code: Alles auswählen

WriteLine("Schaltzustand:  " # item.DPByHssDP ("STATE").Value());
Grüße, Baxxy

Xel66
Beiträge: 14149
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 583 Mal
Danksagung erhalten: 1497 Mal

Re: aktiven Aktor finden

Beitrag von Xel66 » 18.11.2021, 18:27

Scripte, die über Gewerke iterieren sind im Allgemeinen recht schnell (einigermaßen aktuelle Hardware mal vorausgesetzt). Wenn es länger dauert, dann wird das Script vermutlich durch andere Dinge ausgebremst. Irgendwie kommt mir Dein Konstrukt auch irgendwie "von hinten durch die Brust ins Auge" vor.

Reine logische Abfragen ohne jegliche Berechnung kann man im Allgemeinen durch ganz normale WebUI-Programme erledigen. Vielleicht wäre es zielführend, das Konzept mal grundsätzlich zu überdenken. Du baust irgendwelche Strings zusammen, um sie im Nachgang wieder zu zerlegen bzw. einzelne Bestandteile zu korrigieren und/oder auszuwerten. Solche Status kann man auch in Systemvariablen speichern und beliebige Kombinationen in Programmen verarbeiten. Und Aktorstatus ließen soch direkt ohne jegliche Anfrage und Zwischenspeichern verwerten. Somit würde man vieles Hin und Her vermeiden.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

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

Re: aktiven Aktor finden

Beitrag von Baxxy » 18.11.2021, 18:32

Da das Thema wahrscheinlich immer noch die "Bettsteuerung" mit 4 Bedienebenen ist...
Einen Entwurf wie das mit WebUI-Programmen und SysVars gelöst werden kann hatte ich ja hier schon aufgezeigt.

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: aktiven Aktor finden

Beitrag von Tyfys » 18.11.2021, 21:12

Hallo Boris

Ich hab hier auf Baxxys Anregung dieses Statement

Code: Alles auswählen

if (item.State())
gegen dieses getauscht

Code: Alles auswählen

if (item.DPByHssDP("STATE").Value())
Sollte nun noch eine Idee schneller sein.
Gruß
Harry

BDO
Beiträge: 73
Registriert: 14.07.2017, 13:27
Hat sich bedankt: 26 Mal
Danksagung erhalten: 1 Mal

Re: aktiven Aktor finden

Beitrag von BDO » 19.11.2021, 14:36

Wunderbar! Vielen Dank, alles läuft jetzt schell und wie erhofft.
Künftig werde ich Scripte in Codetags posten.
Ich bin für Eure Hilfe wirklich dankbar. Einen besseren "Productsupport" kann ich mir kaum vorstellen.
Da Wünsche ja aber nie enden noch eine Frage:
angenommen, ich habe einen String ";abc;def;ghi;jkl".
Gibt es die Möglichkeit festzustellen, dass "ghi" hinter dem 3. Semikolon steht, also quasi ein umgekehrtes "StrValueByIndex".
Auch hierfür schon einmal meinen Dank im Voraus.
Gruß Boris

Antworten

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