Skript: Zugriff auf Variable schiesst die CCU ab

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Antworten
theshmike
Beiträge: 31
Registriert: 12.01.2018, 11:54
Danksagung erhalten: 1 Mal

Skript: Zugriff auf Variable schiesst die CCU ab

Beitrag von theshmike » 07.02.2018, 20:26

Hallo zusammen,

seit zwei Tagen stürzt mir regelmäßig die CCU2 ab, sodass ich per SSH den ReGa-Dienst manuell neu starten muss:

Code: Alles auswählen

/etc/init.d/S70ReGaHss  start
Ich denke das Phänomen "WebUI geht nicht mehr" ist hier hinlänglich bekannt. Nach mehreren Stunden Fehlersuche habe ich nun herausgefunden, dass eine bestimmte Zeile Code in einem HM-Skript den Daemon abschiesst.
Wenn hier im Haus die Alarmanlage scharf ist, versende ich unter bestimmten Bedingungen eine E-Mail mit div. Angaben zum Alarmereignis. U.a. fasse ich dort die Stati aller Bewegungsmelder und Türkontakte zusammen. Den jeweiligen Status habe ich in je einer eigenen Variable gespeichert. Daraus baue ich mir dann einen E-Mail-Body zusammen, welcher per E-Mail-Addon via Cuxd versendet wird.
Es passiert also Folgendes (zusammengebaut um das Prinzip zu vedeutlichen):

Code: Alles auswählen

var tuer_keller = dom.GetObject("status.tuer.keller");
body.State("Kellertuer offen: " + tuer_keller.Value().ToString() + " (Status vom " + tuer_keller.Timestamp().ToString() + ")")
Das Verrückte ist jetzt, dass das bei 5 von 6 Türkontakten einwandfrei funktioniert. Wenn ich diesen einen bestimmten Türkontakt mit aufnehme, dann stürzt der ReGa-Daemon bei der Ausführung der Skripts ab und die CCU2 ist tot.
Führe ich das Ganze per "Skript testen" aus und ersetze body.State() durch WriteLine() funktioniert alles einwandfrei!

Ich habe bereits einmal die Variable für den Status den Türkontakts sowie das entsprechende Programm welches des Status setzt gelöscht und neu angelegt, was aber nichts bringt.
Heute habe ich einen komplett neuen Türkontakt ins System eingelernt und bediene diesen mit dem gleichen Mechanismus. Nehme ich diesen mit ins Skript auf, schiesst exakt diese Zeile des Daemon ebenfalls ab.

Ich bin nun mit meinem Latein am Ende und hoffe auf eure Erfahrung und Tipps :)

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

Re: Skript: Zugriff auf Variable schiesst die CCU ab

Beitrag von alchy » 07.02.2018, 20:49

theshmike hat geschrieben:Das Verrückte ist jetzt, dass das bei 5 von 6 Türkontakten einwandfrei funktioniert.
Das Script? Nö. eher nicht.
Du wendest .State() auf was an? body gibt es nicht in deinem Script.
Außerdem ist die Verwendung von .ToString() wahrscheinlich absoluter Quatsch.
theshmike hat geschrieben:Daraus baue ich mir dann einen E-Mail-Body zusammen, welcher per E-Mail-Addon via Cuxd versendet wird.
Warum so umständlich und doppelt gemoppelt?
Im TCL Reiter und der Mailvorlage geht das doch einfacher.

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.

theshmike
Beiträge: 31
Registriert: 12.01.2018, 11:54
Danksagung erhalten: 1 Mal

Re: Skript: Zugriff auf Variable schiesst die CCU ab

Beitrag von theshmike » 07.02.2018, 20:59

Okay, nach weiteren 30 Minuten Debugging habe ich jetzt das hier als Ursache herausgefunden:
  • Entweder die CCU2 kann in einem State()-Befehl nur eine begrenzte Anzahl von String-Konkatenationen verarbeiten
    • Oder die CCU2 kann in einem State()-Befehl nur einen String begrenzter Länge verarbeiten
Es war mir jetzt zu blöd das noch bis ins Detail zu testen. Es funktioniert letztendlich mit:

Code: Alles auswählen

string emailbody = "teil1"
emailbody = emailbody + "teil2"
...
body.State(emailbody)
Könnte sein, dass es auch mit mehreren Konkatenationen direkt auf State() funktioniert und ein direktes zuweisen des ganzen Strings an emailbody den Daemon auch killt, habe aber keine Lust das herauszufinden :evil:

Bananensoftware - reift beim Kunden :evil:

theshmike
Beiträge: 31
Registriert: 12.01.2018, 11:54
Danksagung erhalten: 1 Mal

Re: Skript: Zugriff auf Variable schiesst die CCU ab

Beitrag von theshmike » 07.02.2018, 21:04

Du wendest .State() auf was an? body gibt es nicht in deinem Script.
Die Variable wird vorher deklariert, das passt schon so, ich habe ja nur den wichtigen Auschnitt gepostet um das Prinzip zu verdeutlichen.
Außerdem ist die Verwendung von .ToString() wahrscheinlich absoluter Quatsch.
Ja da hast Du recht, habe ich auch gerade gemerkt. Hatte irgendwie im Kopf, dass man Bool-Werte auch casten muss.
Funktioniert aber trotzdem :D

Letztendlich habe ich den Fehler ja nun gefunden, siehe unten :)
Aber danke für Deine Antwort!

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

Re: Skript: Zugriff auf Variable schiesst die CCU ab

Beitrag von alchy » 07.02.2018, 21:29

theshmike hat geschrieben: Die Variable wird vorher deklariert, das passt schon so, ich habe ja nur den wichtigen Auschnitt gepostet um das Prinzip zu verdeutlichen.
Dann brauchst du dich nicht wundern, wenn du keine Antwort mehr erhältst. :roll:

theshmike hat geschrieben: Entweder die CCU2 kann in einem State()-Befehl nur eine begrenzte Anzahl von String-Konkatenationen verarbeiten
Oder die CCU2 kann in einem State()-Befehl nur einen String begrenzter Länge verarbeiten
Halt ich für ein Gerücht, das entweder oder die Ursache ist für dein Problem.
Dein Script nachgebaut auf "funktioniert" und noch ein paar Konkatenationen reicht jedenfalls nicht aus um da irgendeine Grenze aufzutun.
string in variable.jpg
string in variable.jpg (38.27 KiB) 1880 mal betrachtet
theshmike hat geschrieben:Bananensoftware - reift beim Kunden
Grundsätzlich geb ich dir vielleicht ja noch Recht, aber was du da schreibst ist eher aus dem Bereich der Sagen und Mythen.

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.

theshmike
Beiträge: 31
Registriert: 12.01.2018, 11:54
Danksagung erhalten: 1 Mal

Re: Skript: Zugriff auf Variable schiesst die CCU ab

Beitrag von theshmike » 07.02.2018, 22:08

Alchy hat geschrieben: Grundsätzlich geb ich dir vielleicht ja noch Recht, aber was du da schreibst ist eher aus dem Bereich der Sagen und Mythen.
Alchy
Ich will ja jetzt echt nicht trollen, aber als Informatiker will ich das auch nicht so auf mir sitzen lassen 8)
Um auf Deine Einwände einzugehen, das hier bringt die CCU zum Absturz:

Code: Alles auswählen

var motion_eg_flur = dom.GetObject("status.bewegung.eg_flur");
var motion_eg_wohnzimmer = dom.GetObject("status.bewegung.eg_wohnzimmer");
var motion_1og_flur = dom.GetObject("status.bewegung.1og_flur");
var motion_eg_flur_count = dom.GetObject("status.bewegung.eg_flur.count");
var motion_eg_wohnzimmer_count = dom.GetObject("status.bewegung.eg_wohnzimmer.count");
var motion_1og_flur_count = dom.GetObject("status.bewegung.1og_flur.count");

var tuer_haus = dom.GetObject("status.tuer.haustuer");
var tuer_keller = dom.GetObject("status.tuer.keller");
var tuer_garten = dom.GetObject("status.tuer.gartentuer");
var tuer_schaltbox = dom.GetObject("status.tuer.garten_abzweigbox");
var tuer_technikschrank = dom.GetObject("status.tuer.technikschrank");

var alarm_events = dom.GetObject("status.alarm.eventcount");
var alarm_history = dom.GetObject("status.alarm.history");

var body = dom.GetObject("int.emailaddon.body");  
var subject = dom.GetObject("int.emailaddon.subject");  
var rcpt = dom.GetObject("int.emailaddon.rcpt");  
var sendmail = dom.GetObject("int.emailaddon.sendmail");  

body.State(
"Es wurde Alarm ausgeloest.
Insgesamt wurden " + alarm_events.Value().ToString(0) + " Alarmereignisse registriert.
Haussteuerung Anwesenheitsstatus: " + dom.GetObject("user.anwesenheit").Value() + " (Status von: " + dom.GetObject("user.anwesenheit").Timestamp().ToString() + ")
---Status Bewegungsmelder---
Bewegung erkannt EG Flur: " + motion_eg_flur.Value() + " (" + motion_eg_flur_count.Value().ToString(0) + ") - Letzte: "+ motion_eg_flur_count.Timestamp().ToString() + "
Bewegung erkannt EG Wohnzimmer: " + motion_eg_wohnzimmer.Value() + " (" + motion_eg_wohnzimmer_count.Value().ToString(0) + ") - Letzte: "+ motion_eg_wohnzimmer_count.Timestamp().ToString() + "
Bewegung erkannt 1OG Flur: " + motion_1og_flur.Value() + " (" + motion_1og_flur_count.Value().ToString(0) + ") - Letzte: "+ motion_1og_flur_count.Timestamp().ToString() + "

---Status Tueren---
Technikschrank offen:  " + tuer_technikschrank.Value() + " (Status vom " + tuer_technikschrank.Timestamp().ToString() + ")
Haustuer offen: " + tuer_haus.Value() + " (Status vom " + tuer_haus.Timestamp().ToString() + ")
Kellertuer offen: " + tuer_keller.Value() + " (Status vom " + tuer_keller.Timestamp().ToString() + ")
Gartentuer offen: " + tuer_garten.Value() + " (Status vom " + tuer_garten.Timestamp().ToString() + ")
---Ereignishistorie---
" + alarm_history.Value()
);

subject.State("Alarm wurde ausgeloest");
rcpt.State("foo@bar.org");
sendmail.State(2);
während das hier einwandfrei funktioniert:

Code: Alles auswählen

var motion_eg_flur = dom.GetObject("status.bewegung.eg_flur");
var motion_eg_wohnzimmer = dom.GetObject("status.bewegung.eg_wohnzimmer");
var motion_1og_flur = dom.GetObject("status.bewegung.1og_flur");
var motion_eg_flur_count = dom.GetObject("status.bewegung.eg_flur.count");
var motion_eg_wohnzimmer_count = dom.GetObject("status.bewegung.eg_wohnzimmer.count");
var motion_1og_flur_count = dom.GetObject("status.bewegung.1og_flur.count");

var tuer_haus = dom.GetObject("status.tuer.haustuer");
var tuer_keller = dom.GetObject("status.tuer.keller");
var tuer_garten = dom.GetObject("status.tuer.gartentuer");
var tuer_schaltbox = dom.GetObject("status.tuer.garten_abzweigbox");
var tuer_technikschrank = dom.GetObject("status.tuer.technikschrank");

var alarm_events = dom.GetObject("status.alarm.eventcount");
var alarm_history = dom.GetObject("status.alarm.history");

var body = dom.GetObject("int.emailaddon.body");  
var subject = dom.GetObject("int.emailaddon.subject");  
var rcpt = dom.GetObject("int.emailaddon.rcpt");  
var sendmail = dom.GetObject("int.emailaddon.sendmail");  

body.State(
"Es wurde Alarm ausgeloest.
Insgesamt wurden " + alarm_events.Value().ToString(0) + " Alarmereignisse registriert.
Haussteuerung Anwesenheitsstatus: " + dom.GetObject("user.anwesenheit").Value() + " (Status von: " + dom.GetObject("user.anwesenheit").Timestamp().ToString() + ")
---Status Bewegungsmelder---
Bewegung erkannt EG Flur: " + motion_eg_flur.Value() + " (" + motion_eg_flur_count.Value().ToString(0) + ") - Letzte: "+ motion_eg_flur_count.Timestamp().ToString() + "
Bewegung erkannt EG Wohnzimmer: " + motion_eg_wohnzimmer.Value() + " (" + motion_eg_wohnzimmer_count.Value().ToString(0) + ") - Letzte: "+ motion_eg_wohnzimmer_count.Timestamp().ToString() + "
Bewegung erkannt 1OG Flur: " + motion_1og_flur.Value() + " (" + motion_1og_flur_count.Value().ToString(0) + ") - Letzte: "+ motion_1og_flur_count.Timestamp().ToString());

body.State(body.Value() + "
---Status Tueren---
Technikschrank offen:  " + tuer_technikschrank.Value() + " (Status vom " + tuer_technikschrank.Timestamp().ToString() + ")
Haustuer offen: " + tuer_haus.Value() + " (Status vom " + tuer_haus.Timestamp().ToString() + ")
Kellertuer offen: " + tuer_keller.Value() + " (Status vom " + tuer_keller.Timestamp().ToString() + ")
Gartentuer offen: " + tuer_garten.Value() + " (Status vom " + tuer_garten.Timestamp().ToString() + ")
---Ereignishistorie---
" + alarm_history.Value()
);

subject.State("Alarm wurde ausgeloest");
rcpt.State("foo@bar.org");
sendmail.State(2);
Das ist exakt der gleiche Code, nur auf zwei State()-Statements aufgeteilt.
Ich lasse mich echt gern eines besseren belehren, aber für mich ist das der Beweis, dass meine "Oder"-Aussage mit der begrenzten Stringlänge innerhalb desselben Statements zutrifft.

DrTob
Beiträge: 3426
Registriert: 29.10.2010, 08:24
Danksagung erhalten: 5 Mal

Re: Skript: Zugriff auf Variable schiesst die CCU ab

Beitrag von DrTob » 07.02.2018, 23:26

Übrigens: Strings werden idealerweise mit # zusammengesetzt, dann ist auch die vorherige Umwandlung der Operatoren in einen String unnötig. Beim + wird immer in den Typ des rechten konvertiert:

„1“ + 5 == 6
„1“ # 5 == „15“

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

Re: Skript: Zugriff auf Variable schiesst die CCU ab

Beitrag von alchy » 08.02.2018, 16:06

DrTob hat geschrieben: Beim + wird immer in den Typ des rechten konvertiert:
Das andere rechts vielleicht? :mrgreen:

Code: Alles auswählen

WriteLine(1 + "5");  !6
WriteLine("1" + 5);  !15
WriteLine("1" + 1 + "3"); !14
Es wird immer in den linken Wertetyp konvertiert beginnend von rechts.
theshmike hat geschrieben:Ich will ja jetzt echt nicht trollen,
Du schreibst hier 2 Zeilen fehlerhaften Code rein und behauptest die RegaHss würde dadurch abstürzen.
Dann bringst ein "Monsterscript" als Rechtfertigung für deine Aussage.

ich mache es kurz: Ich als User gebe dir als Informatiker, vollkommen Recht. :!:

Es sind maximal 98 Stringverknüpfungen in einer Reihe möglich und wenn du dieses
neu eingeführte blöde + zur String Konkatenationen verwendest sind es ohne Problem sogar nur 97.

Melde es bitte jmaus - der wird sich ganz bestimmt darum kümmern.

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.

DrTob
Beiträge: 3426
Registriert: 29.10.2010, 08:24
Danksagung erhalten: 5 Mal

Skript: Zugriff auf Variable schiesst die CCU ab

Beitrag von DrTob » 08.02.2018, 16:23

alchy hat geschrieben:
Das andere rechts vielleicht? [emoji2]
.
Ich kann’s mir einfach nicht behalten. Aber die Grundaussage stimmt trotzdem [emoji3]

Also halt


1 + „3“ == 4
1 # „3“ == „13“


„1“ + 1 + „3“ = „14“

Antworten

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