Hallo,
kann ich eigentlich die Systemvariable Anwesenheit mit einem Ereignis auf Variablenänderung beschreiben???
Michael
Worauf bezogen?
Nutzt du das hier? [Modul] Homematic Extended (Systemvariablen, Programme, Powermeter u.v.m.)
In der auf GitHub verfügbaren Doku wird erklärt wie man eine Systemvariable in der CCU beschreibt.
Michael
Hi Nall chan,
ich habe Dein Modul zu Testzwecken installiert - Klasse !!!
Hast Du eventuell auch geplant die Servicemeldungen mit auszulesen oder sollte ich mir hierfür das Modul aus der Library laden?
Ciao
HerbertF
Das kann IPS ab Werk.
Script siehe hier
HM_ReadServiceMessages IP-Symcon :: Automatisierungssoftware
Das Script lasse ich über einen Tastendruck einer Virtuellen FB triggern.
Dazu habe ich in der CCU ein Programm, Welches den Tastendruck erzeugt wenn sich die Anzahl der Servicemeldungen ändern.
Michael
Hi Nall chan,
vielen Dank.
Wenn Du jetzt noch Dein Programm aus der CCU posten könntest, fällt selbst mir kein Wunsch mehr ein …
Schönes Sommerwochenende !
herbertf
Hallo,
ich komme mit den Script nicht auf die Füße.
Möcht gerne die Servicemeldungen der CCU 3 in IP-Symcon anzeigen.
HM_ReadServiceMessages
ID der HomeMatic Socket Instanz wo muss diese versorgt werden ?
warum braucht man ein Script in der CCU ?
Ich habe diese Gerät nicht in der CCU (gelbe Markierung)
Vielen Dank !
Gruß Jürgen
Findest du in deinem Objektbaum unter IO.
Brauchen ist zuviel gesagt.
Du kannst das Skript einfach mit einem zyklischen Ereignis starten.
Oder halt:
Das ist eine der Tasten der virtuellen Fernbedienung.
Diese habe ich entsprechend in der CCU benannt und als Instant in Symcon eingerichtet.
Wenn sich jetzt die Variable in Symcon aktualisiert, wird das PHP Skript gestartet.
Aber Vorsicht, es gibt nur Servicemeldungen von HM Geräten, nicht von HmIP. Das ist bis heute nicht durch EQ3 in der CCU umgesetzt worden.
Michael
Danke für die Info !
Ich habe nur noch HM IP Geräte
Ich habe einen Weg gefunden, ist DIY, aber kannst du bestimmt was draus machen:
Ich habe ein Script angelegt, welches die Servicemeldungen in eine Systemvariable schreibt, welche man dann wieder im IP-Symcon abrufen kann. Ums einfacher zu handhaben habe ich noch eine Counter-Variable angelegt.
Von Hand anlegen: Servicemeldungsanzahl (Zahl) und Servicetexte (Text).
Dann dieses Script ausführen, ob periodisch oder bei geänderten Servicemeldungen ist jedem selber überlassen:
! Aktive Servicemeldungen zählen und die Texte in Systemvariable schreiben
object oTmpArray = dom.GetObject(ID_SERVICES);
integer errorCount = 0;
string serviceTexts = "";
if(oTmpArray) {
string sTmp;
foreach(sTmp, oTmpArray.EnumIDs()) {
object oTmp = dom.GetObject(sTmp);
if (oTmp) {
if (oTmp.IsTypeOf(OT_ALARMDP) && (oTmp.AlState() == asOncoming)) {
errorCount = errorCount + 1;
string deviceName = "";
string msgText = "";
object trigDP = dom.GetObject(oTmp.AlTriggerDP());
if(trigDP) {
object och = dom.GetObject(trigDP.Channel());
if(och) {
object odev = dom.GetObject(och.Device());
if(odev) {
deviceName = odev.Name();
}
}
msgText = trigDP.HssType();
}
serviceTexts = serviceTexts # deviceName # ": " # msgText # "; ";
}
}
}
}
dom.GetObject("Servicemeldungsanzahl").State(errorCount);
dom.GetObject("Servicetexte").State(serviceTexts);
WriteLine("Anzahl Servicemeldungen: " # errorCount);
WriteLine("Servicemeldungstexte: " # serviceTexts);
Leider sind die Meldungen dann relativ stupide mit Gerätenamen und Meldungscode (meist englische Kurztexte) belegt, aber man kann was draus machen.
//EDIT: Hab es eben noch ausgebaut, Basis bleibt die selbe, aber er übersetzt die Text und macht nach jedem Geräte einen Zeilenumbruch. Das ist lesbar und in IPS hab ich nen Parser der sie ausliest und jeweils eine eigene Variable draus macht, sieht dann so aus
Hier das neue Script:
! Aktive Servicemeldungen zählen und Texte in Systemvariable schreiben
object oTmpArray = dom.GetObject(ID_SERVICES);
integer errorCount = 0;
string serviceTexts = "";
if(oTmpArray) {
string sTmp;
foreach(sTmp, oTmpArray.EnumIDs()) {
object oTmp = dom.GetObject(sTmp);
if (oTmp) {
if (oTmp.IsTypeOf(OT_ALARMDP) && (oTmp.AlState() == asOncoming)) {
errorCount = errorCount + 1;
string deviceName = "";
string msgText = "";
string timeText = "";
object trigDP = dom.GetObject(oTmp.AlTriggerDP());
time sftime = oTmp.AlOccurrenceTime();
if(trigDP) {
object och = dom.GetObject(trigDP.Channel());
if(och) {
object odev = dom.GetObject(och.Device());
if(odev) {
deviceName = odev.Name();
}
}
string hssType = trigDP.HssType();
! Übersetzung mit einzelnen ifs
if (hssType == "LOWBAT") { msgText = "Batteriestand niedrig"; }
if (hssType == "LOW_BAT") { msgText = "Batteriestand niedrig"; }
if (hssType == "UNREACH") { msgText = "Kommunikationsfehler"; }
if (hssType == "CONFIG_PENDING") { msgText = "Konfigurationsdaten stehen zum Transfer an"; }
if (hssType == "STICKY_UNREACH") { msgText = "hatte Kommunikationsfehler"; }
if (hssType == "ERROR_COMMUNICATION_SENSOR") { msgText = "Kommunikationsfehler"; }
if (hssType == "UPDATE_PENDING") { msgText = "Update verfügbar"; }
if (hssType == "SABOTAGE") { msgText = "Sabotagealarm"; }
if (hssType == "ERROR_SABOTAGE") { msgText = "Sabotagealarm"; }
if (hssType == "ERROR_REDUCED") { msgText = "Temperatur kritisch (Lastabsenkung)"; }
if (hssType == "ERROR_OVERLOAD") { msgText = "Aktor überlastet"; }
if (hssType == "ERROR_JAMMED") { msgText = "Schließmechanismus blockiert"; }
if (hssType == "ERROR_OVERHEAT") { msgText = "Aktor überhitzt"; }
! Wenn keine Übersetzung, dann Originaltext
if (msgText == "") { msgText = hssType; }
}
if (sftime) {
timeText = sftime.Format("%d.%m.%Y %H:%M");
}
serviceTexts = serviceTexts # deviceName # " | " # msgText # " | " # timeText # "\n";
}
}
}
}
dom.GetObject("Servicemeldungsanzahl").State(errorCount);
dom.GetObject("Servicetexte").State(serviceTexts);
WriteLine("Anzahl Servicemeldungen: " # errorCount);
WriteLine("Servicemeldungstexte:\n" # serviceTexts);
Und das IPS-Script, da muss man nur in der ersten Zeile den Ort der neuen Variablen eintragen (ACHTUNG, er löscht was sonst darunter hängt, also am besten leere Kategorie anlegen!) und die VariablenID der Systemvariablen angeben
<?php
// IPS-ObjektID der Kategorie/Parent anpassen!
$parentID = HIER_DIE_ID_DER_NEUEN_KATEGORIE_EINTRAGEN;
// Den Servicetexte-String holen:
$servicetexte = GetValueString(HIER_DIE_ID_DER_SYDTEMVARIABLEN_EINTRAGEN);
// --- 1. Alle vorhandenen Variablen unter dem Parent löschen ---
$children = IPS_GetChildrenIDs($parentID);
foreach($children as $childID) {
if (IPS_GetObject($childID)['ObjectType'] == 2) { // 2 = Variable
IPS_DeleteVariable($childID);
}
}
// --- 2. Jede Zeile parsen und als eigene Variable anlegen ---
$lines = explode("\n", trim($servicetexte));
foreach($lines as $line) {
if (trim($line) == "") continue;
$parts = explode("|", $line);
if (count($parts) < 3) continue; // ungültige Zeile
$geraetename = trim($parts[0]);
$fehlertyp = trim($parts[1]);
$zeit = trim($parts[2]);
$varName = $geraetename . " " . $zeit;
// Variable anlegen
$varID = IPS_CreateVariable(3); // 3 = String
IPS_SetParent($varID, $parentID);
IPS_SetName($varID, $varName);
SetValueString($varID, $fehlertyp);
}
?>```
Ein Beispielscript und Chatgpt sei dank, ging es recht leicht
Hallo Hagbard235,
danke für deine Vorlagen,
habe aber beim Homematic Script noch keine Were bekommen.
hier die Einstellungen in der CCU
Script:
Intervall Aufruf
Systemvariablen:
leider kommen keine Werte bei den Systemvariablen rein !
habe ich da noch was vergessen ?
Gruß Jürgen
Ja, weil die Namen falsch sind!
„Warum nutzen alle immer Ausrufezeichen “
Korrekt wäre:
Servicetexte
und
Servicemeldungsanzahl
Michael
Hallo Michael,
ich glaube da habe ich mich falsch ausgedrückt !
bei mit kommt schon aus den Homematic Script nicht raus,
obwohl es Servicemeldungen gibt und ich das Scipt keine Fehler anzeigt.
Gruß Jürgen
Die Namen der Systemvariablen in der CCU und den Namen der Systemvariablen im HM-Script sind nicht gleich. Darum passiert da nix.
Namen im HM-Script:
Michael
Hallo Michael,
danke für die Info, läuft !
Danke
Sorry, hatte oben den falschen Namen in meinem Text verwendet, nicht den aus dem Script…
Aber so sollte es laufen.