letzter Kontakt der Devices, Listen sortieren

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

Moderator: Co-Administratoren

Antworten
Stefan0815
Beiträge: 169
Registriert: 16.04.2019, 15:15
Hat sich bedankt: 9 Mal
Danksagung erhalten: 10 Mal

letzter Kontakt der Devices, Listen sortieren

Beitrag von Stefan0815 » 04.05.2020, 14:43

Gelegentlich kann es nützlich sein zu wissen, welche Devices wann das letzte mal mit der CCU gesprochen haben. Dafür habe ich mal ein kleines Script gebastelt, welches durch die Liste aller "echten" HmIP-Devices läuft und jeder Channel nach seiner letzten Aktualisierung abklopft. Man kann dann recht gut erkennen, wer häufig mit der CCU spricht oder wessen Status nach einem Neustart noch nicht aktualisiert wurde. Das Script gibt eine sortierte Liste aus und erwartet eine String-Systemvariable mit dem Namen "letzter.Kontakt". Es wird das Name, der Channel und der Abstand des letzten Kontaktes in Stunden, Minuten und Sekunden mit Bezug zu NOW ausgegeben. Das Script kann sehr leicht auf das BidCos-RF-Interface ausgeweitet/geändert werden. Nebenbei gibt es noch ein kleines Beispiel für die Sortierung einer Liste. Wie Insider sehen, ist das alles mit BLACKs Script Developer (viewtopic.php?f=31&t=47049) entstanden. DANKE dafür. Bei mir läuft das Script alle 3 Minuten. Bitte aber eine kurze "Schonfrist" beim Systemstart einbinden. Viel Spaß beim Nachbau.

Code: Alles auswählen

!- letzen Kontakt zu einem Device bestimmen, bytelander - 04.05.2020
string device_str;
object device_obj;
object interface_obj;
string channel_str;
object channel_obj;
integer timeLastAction;
string channel_txt;
string timestamp_txt;
integer now = system.Date("%F %X").ToTime().ToInteger();

foreach(device_str, dom.GetObject(ID_DEVICES).EnumUsedIDs()){   !- durch alle Device
  device_obj = dom.GetObject(device_str);                       !- Device-Object
  interface_obj =  dom.GetObject(device_obj.Interface());
  if ((interface_obj.Name()=="HmIP-RF") && (device_obj.Name()!="HmIP-RCV-50")){  !- alle Device am Interface HmIP außer Virtuelle Fernbedienung der CCU3
     timeLastAction = -1;                                         !- Vergleichswert setzen
     foreach(channel_str, device_obj.Channels().EnumUsedIDs()){   !- durch alle Cannel
        channel_obj = dom.GetObject(channel_str);                 !- Channel-Object
        if (channel_obj.LastDPActionTimeSeconds()>timeLastAction){
           timeLastAction = channel_obj.LastDPActionTimeSeconds();
           channel_txt = device_obj.Name() + ":" + channel_obj.ChnNumber().ToString() + "#" + timeLastAction.ToString();
        }
      }
      timestamp_txt = timestamp_txt + channel_txt + "\t";
  } !- ENDE IF Interface-Type
}   !- ENDE FOREACH alle Device
timestamp_txt = timestamp_txt.Trim();  !- letztes TAB abschneiden
!- WriteLine(timestamp_txt.Replace("\t","\n"));

!- Sammmlung beendet, jetzt sortieren
string list = timestamp_txt;
string index;
integer comp;
integer count;
integer greatest_value;
string new_list;
string sort_list;

while (list.Length()!=0){
      comp = -1;
      count = 0;
      new_list="";
      foreach (index, list){
          if(index.StrValueByIndex("#",1).ToInteger()>comp){
               comp=index.StrValueByIndex("#",1).ToInteger();
               greatest_value = count;
          }
      count = count + 1;
      }
      count = 0;
      foreach (index, list){
               if(count!=greatest_value){
                    new_list = new_list # index # "\t";
               }
               else{
                    sort_list = sort_list # index # "\t";
               }
               count = count + 1;
      }
      list = new_list.Trim();
}
sort_list = sort_list.Trim();   !- letztes TAB abschneiden
!- WriteLine(sort_list.Replace("\t","\n"));

!- Output zusammensetzen
string output_txt;
string output_time;
var hour_txt;
var minute_txt;
var second_txt;

foreach (index, sort_list){
      second_txt = now-index.StrValueByIndex("#",1).ToInteger();
      hour_txt = (second_txt/3600).Floor().ToInteger();
      minute_txt = (second_txt.Mod(3600)/60).Floor().ToInteger();
      second_txt = second_txt.Mod(60).Floor().ToInteger();
      hour_txt = "0" + hour_txt.ToString();
      hour_txt = hour_txt.Substr(hour_txt.Length()-2,2);
      minute_txt = "0" + minute_txt.ToString();
      minute_txt = minute_txt.Substr(minute_txt.Length()-2,2);
      second_txt = "0" + second_txt.ToString();
      second_txt = second_txt.Substr(second_txt.Length()-2,2);
      if (index.StrValueByIndex("#",1).ToInteger()==0){   !- Sonderfall kein gültiger Status
           output_txt = index.StrValueByIndex("#",0) + ": " + "Status fehlt\n" + output_txt;
      }
      else {
           output_txt = index.StrValueByIndex("#",0) + ": " + hour_txt + ":" + minute_txt + ":" + second_txt + "\n" + output_txt;
      }
}
output_txt = output_txt.Trim();
output_txt = output_txt + "\n\n" + "letzte Aktualisierung: " +now.ToTime().Format("%d.%m.%Y %H:%M:%S Uhr");

!- WriteLine(output_txt);
dom.GetObject("letzter.Kontakt").State(output_txt);
Unbenannt.PNG
Viele Grüße
Stefan

werner07
Beiträge: 48
Registriert: 27.01.2017, 18:20
System: CCU
Hat sich bedankt: 29 Mal

Re: letzter Kontakt der Devices, Listen sortieren

Beitrag von werner07 » 12.12.2021, 23:50

Guten Abend!

Der Thread ist schon etwas älter, aber jetzt auf fruchtbaren Boden gefallen. Gesucht habe ich nach einer Liste aller Virtuellen Taster der CCU (HmIP-RCV-50) und glaubte schon, die hier gefunden zu haben. Zwar ist die Liste wesentlich umfassender, aber wenn ich das Skript laufen lasse, wird einzig der Virtuelle Taster (hier immer HmIP-RCV-50 HmIP-RCV-1:38: 08:17:18) ausgegeben (jeweils mit aktueller Zeit). Völlig egal, welche anderen Taster ich bedient habe.

Mache ich da was falsch oder könnte das gar ein Bug sein? :wink:
Nachtrag: Das Skript gibt Geräte aus; was ich gesucht habe, sind die Taster, also Kanäle. Trotzdem irritiert mich die Ausgabe des einzigen Tasters HmIP-RCV-1:38. Und im Kommentar des Skripts werden Virtuelle Geräte (leider) ausgeschlossen.
Also ich glaube, den "Bug" ziehe ich mangels Durchblick erstmal nicht mehr in Erwägung...

Wäre super, wenn mir jemand weiterhelfen könnte, das Skript übersteigt definitiv meine Fähigkeiten!

Viele Grüße
Werner
Der Weg ist das Ziel ...

alchy
Beiträge: 10744
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 671 Mal

Re: letzter Kontakt der Devices, Listen sortieren

Beitrag von alchy » 16.12.2021, 21:33

werner07 hat geschrieben:
12.12.2021, 23:50
Gesucht habe ich nach einer Liste aller Virtuellen Taster der CCU (HmIP-RCV-50)
Um alle Kanäle eines bestimmten Gerätes auszugeben ist das Script oversized :shock:
(und hier auch nicht der richtige Thread, da es hier um die Ausgabe der Zeiten angeht.)

Code: Alles auswählen

object oObj = devices.Get("NAME DES GERÄTES");
string sItem;
foreach(sItem, oObj.Channels()){
object oChannel = dom.GetObject(sItem);
WriteLine(oChannel.Name());
}


Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

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

Re: letzter Kontakt der Devices, Listen sortieren

Beitrag von Baxxy » 16.12.2021, 22:25

werner07 hat geschrieben:
12.12.2021, 23:50
Also ich glaube, den "Bug" ziehe ich mangels Durchblick erstmal nicht mehr in Erwägung...
Tatsächlich müsste das Script an einer Stelle geändert werden.
Die 50 virtuellen IP-Tasten sollen ja komplett ignoriert werden. Da über .Name() zu filtern ist leider fehleranfällig denn jeder kann die virtuelle Fernbedienung umbenennen und genau das hat eQ-3 irgendwann nach Erstellung des Scriptes gemacht.

Deshalb taucht jetzt immer genau ein Kanal (von 50 + Kanal:0) in der Liste auf und zwar der, der zuletzt "betätigt" wurde.
werner07 hat geschrieben:
12.12.2021, 23:50
Das Skript gibt Geräte aus
Jein. :wink: Es gibt von jedem Gerät genau den einen Kanal aus der sich als letzter gemeldet hatte.
Das kann auch Kanal:0 wegen einer zykl. Übertragung sein.
werner07 hat geschrieben:
12.12.2021, 23:50
Trotzdem irritiert mich die Ausgabe des einzigen Tasters HmIP-RCV-1:38
Da musst du mal prüfen ob der nicht von irgendwas dauernd "gedrückt" wird.

Antworten

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