alchy hat geschrieben: ↑05.11.2020, 17:48
Ich hatte gestern Nacht nur kurz geschaut und habe jetzt schon einen Schreck bekommen. Aber nix da:
Gerade mit einigen Geräten versucht,
Script von
H I E R
Kanal ohne Schalthandlung nach Reboot der CCU
[...]
Auf einer CCU3 mit der Rega geht das nun wieder was damals auf einer CCU2 mit der Rega nicht ging - und auf einer Raspi augenscheinlich auch wieder nicht mehr geht. Was da wohl zwischendurch passiert ist?
Das von dir beschriebene Verhalten bzw. die Nutzung von LastDPActionTime() auf einen Datenpunkt funktioniert in deiner CCU3 nur weil du dort wohl die Logikschicht/ReGaHss version auf "Kompatibilitätsmodus" gestellt hast und damit die striktere Prüfung der Methodennutzung ja deaktiviert ist.
Wenn du dich erinnerst gab es ja damals das Problem das man manche Methoden auf teilweise beliebige Objekte ausführen konnte. D.h. es fand keinerlei Typprüfung statt ob das Objekt auch zur Methode passte oder nicht. Und bei LastDPActionTime() und LastTimeStamp() war das z.B. so. D.h. man konnte beide auf einen Kanal- oder Datenpunktobjekt loslassen und erhielt jeweils das gleiche. Konkret bedeutete das, das channel.LastDPActionTime() und channel.LastTimeStamp() gaben exakt das selbe zurück weil beide eben die selbe interne ID besaßen und das obwohl beiden wie folgt definiert sind:
LastDPActionTime() - Channel get the last datapoint action timestamp.
LastTimestamp() - Data point last timestamp
D.h. also das LastDPActionTime() eigentlich nur auf ein Kanalobjekt angewendet werden darf und LastTimestamp() eben nur auf ein Datenpunktobjekt. Aber weil die ganz frühen ReGaHss Versionen eben leider keine Objekttyp-Prüfung für gewisse Methoden durchgeführt hatte hat es fälschlicherweise funktioniert das man auch auf einen Datenpunkt LastDPActionTime() aufrufen konnte obwohl das ja keinerlei Sinn ergibt weil das ja bereits ein Datenpunktobjekt ist und folglich man LastTimestamp() haben/nutzen sollte.
Im Laufe der Korrektur dieses Umstandes und der damit verbundenen strikteren Handhabung aller möglicher Methoden ergab sich dann auch, das ich explizit für diesen Umstand eine Warnung bei der vermeintlich falschen Nutzung von LastTimestamp() eingebaut habe die wie folgt dann eine Warnung ausgibt:
WARNING: incorrect use of LastTimestamp() (use LastDPActionTime())
Und genau diese Warnung wird eben nun auch für deinen oben verlinkten Skript ausgegeben wenn man eine aktuelle ReGaHss bzw. eine ReGaHss im Nicht-Kompatibilitätsmodus (was ja der standard inzwischen ist) verwendet.
Bestätigen konnte ich das z.B. mit folgendem Beispielskript angewendet auf einen kanal der internen virtuellen Fernbedienung
Code: Alles auswählen
! RegaVersion usw. ausgeben
WriteLine("Version: " # dom.Version());
WriteLine("Build: " # dom.BuildLabel());
string kanalname = "HM-RCV-50 BidCoS-RF:1";
WriteLine("Wert: "#dom.GetObject(kanalname).DPByHssDP("PRESS_SHORT").Value());
WriteLine("Letzter Wert: "#dom.GetObject(kanalname).DPByHssDP("PRESS_SHORT").LastValue());
WriteLine("DP Timestamp: "#dom.GetObject(kanalname).DPByHssDP("PRESS_SHORT").Timestamp());
WriteLine("DP LasTimestamp: "#dom.GetObject(kanalname).DPByHssDP("PRESS_SHORT").LastTimestamp());
WriteLine("Kanal LastActiontime: "#dom.GetObject(kanalname).LastDPActionTime()) ;
WriteLine("Kanal LastTimestamp: "#dom.GetObject(kanalname).LastTimestamp()) ;
WriteLine("DP LAstActionTime: "#dom.GetObject(kanalname).DPByHssDP("PRESS_SHORT").LastDPActionTime()) ; ! geht gar nicht
WriteLine("DONE");
Hier kommt er eben nicht bis zu "DONE" und schmeisst am schluss einen ScriptRuntimeError egal ob man die normale ReGaHss Version einer 3.53.x CCU3 Firmware oder von RaspberryMatic verwendet:
Code: Alles auswählen
Version: 2.1.369
Build: R1.00.0388.0226
Wert: false
Letzter Wert: true
DP Timestamp: 2020-11-05 20:46:48
DP LasTimestamp: 2020-11-05 20:46:48
Kanal LastActiontime: 2020-11-05 20:46:48
Kanal LastTimestamp: 2020-11-05 20:46:48
DP LAstActionTime:
Code: Alles auswählen
Version: 2.1.369
Build: R1.00.0388.0217
Wert: false
Letzter Wert: true
DP Timestamp: 2020-11-05 20:50:53
DP LasTimestamp: 2020-11-05 20:50:53
Kanal LastActiontime: 2020-11-05 20:50:53
Kanal LastTimestamp: 2020-11-05 20:50:53
DP LAstActionTime:
Und zusätzlich schmeisst das Skript dann eben auch die besagte Warnung:
Code: Alles auswählen
[2020-11-05 20:50:58 CET] WARNING: incorrect use of LastTimestamp() (use LastDPActionTime()): ! RegaVe....
Und diese rührt von Zeile 10 des/deines Skriptes her bei der zwar der Skript durchläuft (und deshalb LastTimestamp()+LastDPActionTime() aus rückwärtskompatibilitäsgründen) das gleiche ausgibt, aber eben nur die Nutzung von LastDPActionTime() die richtig zu nutzende Methode für ein Kanalobjekt ist. Hoffe das erklärt es etwas detaillierter.