Änderung SV-Kanalzuordnung zerstört Programme

Fehler in Firmware und WebUI & Workarounds

Moderator: Co-Administratoren

Benutzeravatar
Black
Beiträge: 5460
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 417 Mal
Danksagung erhalten: 1069 Mal
Kontaktdaten:

Re: Änderung SV-Kanalzuordnung zerstört Programme

Beitrag von Black » 06.06.2019, 12:18

also das löschen oder das verändern zu verhindern finde ich... quatsch

es muss an der stelle einfach nur gewährleistet werden, dass die bezüge und verweise in sich korrekt und kosistent sind.
das sind sie jetz nicht.
lösungsansatz von mir wäre:
Bei Anlegen, Löschen, verändern einer Kanalzuordnung folgender durchlauf.
Iterieren über alle enthaltenen Singleconditions und Singledestinations
ist eine eine systemvariable ohne Kanalzuweisung: ?
wenn ja: type ist ivtSystemID, xxxChannel (Conditon oder Destination) ist ID_Error
ist es eine Sysvar mit gültiger ! Kanalzuweisung oder ein HSSDP ?
wenn ja Type ist ivtrObjectId, xxxChannel (Conditon oder Destination) ist der Kanal der Sysvar bzs des HSS.

Das ist die ganze kunst.

was anderes macht der sdv auch nicht, wenn dann in einem Programm eine Sysvar mit Kanalzuweisung geändert wird, dass dort der Kanalbezug entfernt wird, dann erscheint nach dem Korrekturlauf des SDV das programm wieder in der Form, das dort eine Systemvariable angeboten wird, und zwar die richtige.

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Benutzeravatar
jmaus
Beiträge: 9805
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 457 Mal
Danksagung erhalten: 1848 Mal
Kontaktdaten:

Re: Änderung SV-Kanalzuordnung zerstört Programme

Beitrag von jmaus » 06.06.2019, 13:08

Black hat geschrieben:
06.06.2019, 12:18
lösungsansatz von mir wäre:
Bei Anlegen, Löschen, verändern einer Kanalzuordnung folgender durchlauf.
Iterieren über alle enthaltenen Singleconditions und Singledestinations
ist eine eine systemvariable ohne Kanalzuweisung: ?
wenn ja: type ist ivtSystemID, xxxChannel (Conditon oder Destination) ist ID_Error
ist es eine Sysvar mit gültiger ! Kanalzuweisung oder ein HSSDP ?
wenn ja Type ist ivtrObjectId, xxxChannel (Conditon oder Destination) ist der Kanal der Sysvar bzs des HSS.

Das ist die ganze kunst.
Ich möchte hier wirklich helfen, Michael. Aber ich tue mich wirklich schwer deinen Ausführungen zu folgen. Kannst du denn das nicht anhand eines einzelnen Beispieles vielleicht sogar mit Beispiel ReGa-Skript code einmal aufzeigen damit ich das reproduzierbar nachvollziehen kann? Das würde mir wirklich ungemein helfen denn ansonsten dauert es vmtl. noch eine Weile bis ich dann dazukomme mir eigene Beispiele auszudenken die das Problem und die Reparatur/Konsistenzprüfung reproduzieren helfen.
RaspberryMatic 3.73.9.20240130 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Benutzeravatar
Black
Beiträge: 5460
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 417 Mal
Danksagung erhalten: 1069 Mal
Kontaktdaten:

Re: Änderung SV-Kanalzuordnung zerstört Programme

Beitrag von Black » 06.06.2019, 13:45

so damit es lesbarer bleibt, der Code aus PASS 1 aus der automatischen codegenerierung des SDV:

mal auf die schnelle probiert, ist lauffähig. Man könnte optimieren von hand, weiss ich , wie gesagt, aus der automatischen generierung.
das soll funktionieren, muss net toll aussehen, ich wollt für die zeilen auch keinen schönheitspreis gewinnen

Code: Alles auswählen

boolean infoAll  =  false;
boolean infotip =   true;
boolean corr =      false;
boolean infoshown= false;
string sPRG;
string sSDest;
string sCond;
string sSCond;
object oPRG;
object oRule;
object oCond;
object oSCond;
object oDest;
object oSDest;
object oOBJ;
integer iRule=1;
integer SaveID=0;
integer nErr=0;
integer nCorr=0;
integer nPRG=0;
integer x=0;
string sCorr=""; if (corr) {sCorr= " --> korrigiert"; }
string sProgInfo="";
string slinie= "----------------------------------------------------------------";
boolean isVarDP;
boolean isHssDP;
WriteLine ("ProgrammAnalyse Konsistenz ConditionChannel und DestinationChannel");
WriteLine ("Black in Juni 2019");
WriteLine (slinie);
foreach (sPRG,dom.GetObject (ID_PROGRAMS).EnumIDs () ){
  oPRG= dom.GetObject (sPRG);
  if (oPRG) {
    infoshown= false;
    sProgInfo= "Analyse Program: " # oPRG.Name () # " [ID: "# oPRG.ID () #"]";
    if (infoAll) {WriteLine (sProgInfo);}
    oRule= oPRG.Rule ();
    iRule=1;
    while (oRule){
        foreach (sCond, system.GenerateEnum (0,oRule.RuleConditions().Count()-1)) {
           oCond= oRule.RuleCondition (sCond.ToInteger () );
             foreach (sSCond, system.GenerateEnum (0,oCond.CndSingleCount ()-1)) {
                oSCond= oCond.CndSingleCondition (sSCond);
                  !- Hier sind wir in der Singlecondition
                  !- Testen auf eine Systemvariable/HSS
                  if ((oSCond.LeftValType () == ivtSystemId) || (oSCond.LeftValType() == ivtObjectId)) {
                     oOBJ= dom.GetObject (oSCond.LeftVal () );
                     if (oOBJ) {
                        isVarDP = (oOBJ.Channel() == ID_ERROR) && ((oOBJ.Type() == OT_VARDP) || (oOBJ.Type() == OT_ALARMDP));
                        isHssDP = (oOBJ.Channel() != ID_ERROR) || (oOBJ.Type() == OT_HSSDP);
                        if (isVarDP && (oSCond.LeftValType () != ivtSystemId)) {
                           !- Es muss eine SystemVariable sein, ist aber keine
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSCond.ID () # "] Rule-Nr: " # iRule # ", CND-Nr: " # (sCond.ToInteger()+1) # ", SCND-Nr: " # (sSCond.ToInteger()+1) # " -- LeftValType muss ivtSystemId sein, ist es aber nicht [" # oOBJ.Name () # "]" # sCorr);
                           if (corr) {
                               nCorr=nCorr+1;
                               x= oSCond.LeftVal ();
                               oSCond.LeftValType (ivtSystemId);
                               oSCond.LeftVal (x);
                            }
                            infoshown=true;
                        }
                        elseif (isHssDP && (oSCond.LeftValType () != ivtObjectId)) {
                           !- Es muss ein HSSDP sein, ist aber kein
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSCond.ID () # "] Rule-Nr: " # iRule # ", CND-Nr: " # (sCond.ToInteger()+1) # ", SCND-Nr: " # (sSCond.ToInteger()+1) # " -- LeftValType muss ivtObjectId sein, ist es aber nicht [" # oOBJ.Name () # "]" # sCorr);
                           if (corr) {
                               nCorr=nCorr+1;
                               x= oSCond.LeftVal ();
                               oSCond.LeftValType (ivtObjectId);
                               oSCond.LeftVal (x);
                           }
                           infoshown=true;
                        }
                        if (isHssDP && (oSCond.ConditionChannel () != oOBJ.Channel () )) {
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSCond.ID () # "] Rule-Nr: " # iRule # ", CND-Nr: " # (sCond.ToInteger()+1) # ", SCND-Nr: " # (sSCond.ToInteger()+1) # " -- ConditionChannel() indiziert nicht Object (LeftVal).Channel ()" # sCorr);
                           if (corr) {
                              nCorr=nCorr+1;
                              oSCond.ConditionChannel (oOBJ.Channel ());
                           }
                           infoshown=true;
                        }
                        elseif ((!isHssDP) && (oSCond.ConditionChannel () != ID_ERROR )) {
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSCond.ID () # "] Rule-Nr: " # iRule # ", CND-Nr: " # (sCond.ToInteger()+1) # ", SCND-Nr: " # (sSCond.ToInteger()+1) # " -- ConditionChannel() indiziert nicht ID_ERROR" # sCorr);
                           if (corr) {
                              nCorr=nCorr+1;
                              oSCond.ConditionChannel (ID_ERROR);
                           }
                           infoshown=true;
                        }
                     }
                  }
             } !- Klammer foreach Single Condition
        } !- Klammer Foreach Condition
        oDest= oRule.RuleDestination ();
        if (oDest) {
           foreach (sSDest, system.GenerateEnum (0,oDest.DestSingleCount() -1)) {
              oSDest= oDest.DestSingleDestination (sSDest.ToInteger () );
              if (oSDest) {
                  if ((oSDest.DestinationParam() == ivtSystemId) || (oSDest.DestinationParam() == ivtObjectId)) {
                     oOBJ= dom.GetObject (oSDest.DestinationDP () );
                     if (oOBJ) {
                        isVarDP = (oOBJ.Channel() == ID_ERROR) && ((oOBJ.Type() == OT_VARDP) || (oOBJ.Type() == OT_ALARMDP));
                        isHssDP = (oOBJ.Channel() != ID_ERROR) || (oOBJ.Type() == OT_HSSDP);
                        if (isVarDP && (oSDest.DestinationParam () != ivtSystemId)) {
                           !- Es muss eine SystemVariable sein, ist aber keine
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SDEST-ID: " # oSDest.ID () # "] Rule-Nr: " # iRule # ", SDEST-Nr: " # (sSDest.ToInteger()+1) # " -- DestinationParam muss ivtSystemId sein, ist es aber nicht [" # oOBJ.Name () # "]" # sCorr);
                           if (corr) {
                               nCorr=nCorr+1;
                               x= oSDest.DestinationDP ();
                               oSDest.DestinationParam (ivtSystemId);
                               oSDest.DestinationDP (x);
                            }
                            infoshown=true;
                        }
                        elseif (isHssDP && (oSDest.DestinationParam () != ivtObjectId)) {
                           !- Es muss ein HSSDP sein, ist aber kein
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SDEST-ID: " # oSDest.ID () # "] Rule-Nr: " # iRule # ", SDEST-Nr: " # (sSDest.ToInteger()+1) # " -- DestinationParam muss ivtObjectId sein, ist es aber nicht [" # oOBJ.Name () # "]" # sCorr);
                           if (corr) {
                               nCorr=nCorr+1;
                               x= oSDest.DestinationDP ();
                               oSDest.DestinationParam (ivtObjectId);
                               oSDest.DestinationDP (x);
                            }
                            infoshown=true;
                        }
                        if (isHssDP && (oSDest.DestinationChannel () != oOBJ.Channel () )) {
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSDest.ID () # "] Rule-Nr: " # iRule # ", SDEST-Nr: " # (sSDest.ToInteger()+1) # " -- DestinationChannel() indiziert nicht Object (LeftVal).Channel ()" # sCorr);
                           if (corr) {
                              nCorr=nCorr+1;
                              x= oSDest.DestinationDP ();
                              oSDest.DestinationChannel (oOBJ.Channel ());
                              oSDest.DestinationDP (x);
                           }
                           infoshown=true;
                        }
                        elseif ((!isHssDP) && (oSDest.DestinationChannel() != ID_ERROR )) {
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSDest.ID () # "] Rule-Nr: " # iRule # ", SDEST-Nr: " # (sSDest.ToInteger()+1) # " -- DestinationChannel() indiziert nicht ID_ERROR" # sCorr);
                           if (corr) {
                              nCorr=nCorr+1;
                              x= oSDest.DestinationDP ();
                              oSDest.DestinationChannel (ID_ERROR);
                              oSDest.DestinationDP (x);
                           }
                           infoshown=true;
                        }
                     }
                  }
              } !- if oSDest
           }  !- Foreach
        } !- oDest
      oRule= oRule.RuleSubRule ();
      iRule=iRule+1;
   } !- While Rule
  } !- if oPRG

}
  if (infoshown ) {WriteLine (slinie);}
!-**************************************************************************************************************************************
!-}
WriteLine ("Geprüft: " # dom.GetObject (ID_PROGRAMS).Count () # " Programme");
if (nErr==0) {
  WriteLine ("Keine Aufälligkeiten festgestellt");
} else {
  WriteLine ("Dabei wurden " # nErr # " Inkonsistenzen gefunden in " # nPRG # " Programmen");
  Write ("Von diesen " # nErr # " Inkonsistenzen wurden ");
  if (nCorr==0) {WriteLine ("keine korriert");} else {WriteLine (nCorr # " korrigiert"); }
}
gruss, Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Benutzeravatar
jmaus
Beiträge: 9805
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 457 Mal
Danksagung erhalten: 1848 Mal
Kontaktdaten:

Re: Änderung SV-Kanalzuordnung zerstört Programme

Beitrag von jmaus » 06.06.2019, 14:23

Danke Michael, das hilft ungemein weiter. Werde ich dann mal versuchen einzusetzen bzw,. zu analysieren um das Problem direkt in ReGa/WebUI bereits abzufangen.
RaspberryMatic 3.73.9.20240130 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Benutzeravatar
koppenho
Beiträge: 227
Registriert: 27.12.2013, 09:12
Wohnort: Bad Neustadt, Deutschland
Hat sich bedankt: 2 Mal
Danksagung erhalten: 2 Mal

Re: Änderung SV-Kanalzuordnung zerstört Programme

Beitrag von koppenho » 06.06.2019, 19:12

Hypnos hat geschrieben:
06.06.2019, 08:48
koppenho hat geschrieben:
05.06.2019, 19:35
Wenn die Programme, bzw. die Kodierung der WebUI-Konditionen eine Kanalzuordnung ignorieren, würde nichts passieren. Nach dem Löschen einer Kanalzuordnung sollte es in der WebUI so aussehen, als ob es nie eine Zuordnung gegeben hätte. Eine WebUI-Programm sollte dann eine einfache SV referenzieren.
Das ist aber auch gefährlich. Wenn ich eine Systemvariable lösche und deren Bedingung und Logik damit automatisch aus allen Programmen entfernt wird, ändert sich ja damit die Logik der Programme.
Löschen einer SV haben wir noch noch gar nicht betrachtet. Wir diskutierten bisher nur über die Änderung/Löschung einer Kanalbindung bei dem die SV erhalten bleibt.
Hypnos hat geschrieben:
06.06.2019, 08:48
Da sollte zumindest eine auffällige Warnung angezeigt werden.
Die Sichere Variante wäre es einfach das Löschen zu verbieten, solange eine Systemvariable noch in einem Programm enthalten ist.
Dem kann ich nur zustimmen.

Es gibt noch eine Situation, die wir bisher übersehen haben. Was passiert mit der Kanalbindung wenn das zum Kanal gehörende Gerät gelöscht wird? Erwarten würde ich, dass die Bindung entfernt wird und die SV ansonsten unversehrt zurückbleibt.
--
Andreas
--------------------------------------------
Hauptwohnung: RaspberryMatic mit 320 Kanäle in 110 Geräten und 140 CUxD-Kanäle in 33 CUxD-Geräten
Zweitwohnung: CCU2 mit 18 Kanäle in 8 Geräten und 14 CUxD-Kanäle in 4 CUxD-Geräten
--------------------------------------------

Benutzeravatar
Black
Beiträge: 5460
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 417 Mal
Danksagung erhalten: 1069 Mal
Kontaktdaten:

Re: Änderung SV-Kanalzuordnung zerstört Programme

Beitrag von Black » 06.06.2019, 20:14

@koppenho

beim löschen bleibt bekannterweise ein Geisterbezug stehen. Die aktuelle raspberrymatik sollte (konjunktiv) dieses bei regastart aber glattziehen können (ansonsten der SDV Menüpunkt CheckChannel Sysvar).

Nach diesem Lauf zieht Cond-Dest Channel die restlichen bezüge wieder grade.

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Antworten

Zurück zu „HomeMatic - bekannte Bugs“