ich verwende IP-Symcon seit kurzem zur Steuerung meiner Heimkinoanlage inkl. Leinwand usw.
In das eigene Heim habe ich nun ein KNX-System installieren lassen.
Gesteuert/überwacht werden sollen Rolladen, Heizung, Licht, Fensterkontakte und Steckdosen.
Die EInbindung in IP-Symcon aus der ETS hat problemlos funktioniert.
Ich kann bereits über das Webfront die Rolladen fahren lassen, die Heizung An-/Ausschalten und Lichter/Steckdosen schalten. Leider habe ich es bis jetzt nich hinbekommen den aktuellen Zustand der Fenster-/Türkontakte in IP-Symcon angezeigt zu bekommen.
Ich bin noch recht neu auf dem KNX-Gebiet.
Könnte mir evtl. jemand den entsprechenden Hinweis geben wie ich die Zustände abgefragt bekomme? Alle anderen Werte werden ja „automatisch“ auf den Bus gesendet, d.h. Temperatur usw. nur der Zustand der Fensterkontakte wird nicht aktualisiert.
Ich habe bereits mit
<?
EIB_RequestStatus(55220 /*[KG + EG\Status\EG - Wohnen - Türkontakt\Value]*/);
//Fügen Sie hier Ihren Skriptquellcode ein
?>
versucht den Wert auszulesen, erhalte aber als Fehlermeldung
Warning: EIB_RequestStatus: Instance #55220 not found!
Auch wenn ich kein KNX habe, hast du einen für Einsteiger üblichen Fehler gemacht.
Du hast die ID der Variable eingetragen im Script, da muss aber die ID der Instanz rein.
Welche du auf dem Screenshot leider abgeschnitten hast.
Das gilt für alle Befehle von Instanzen egal ob KNX oder sonst was.
Michael
Als Ergebnis wird mir immer 1 angezeigt, egal ob die Tür offen oder geschlossen ist. Die Kontakte wurden alle vom Elektriker getestet; funktionieren also.
Ich würde mal vermuten, dass man beide Antworten kombinieren muss!?
Also erst den Status-Requesten von der Instanz, damit der Status in der Variable aktuell ist, dann den Status der Variable mit „GetValue“ abfragen. Den Status-Requesten brauchst du aber nur, wenn der nicht von selbst oft genug oder nicht bei jeder Änderung automatisch gemeldet wird, wovon ich aber ausgehe (einfach testen, ob öffnen/schließen angezeigt wird).
Also reicht der Teil mit „$status = GetValue(Variablen-ID);“
Edit: Was passiert denn mit deiner Variable wenn du eine Tür auf/zu machst? Was passiert mit deiner Variable, wenn du eine Tür auf/zu machst und dann jeweils mit EIB_RequestStatus den aktuellen Wert abfragst? Normal sollte es ja so sein, dass wenn du eine Tür öffnest, dass das innerhalb 1-2 Sekunden auch im IPS direkt so in der Variable angezeigt wird (von alleine).
das wars; mit GetValueBoolean erhalte ich je nach Fensterstatus 1 oder „“.
Dabei habe ich gemerkt, dass der Kontakt im Wohnzimmer, den ich zum Testen hergenommen hatte, nicht funktioniert
Von alleine wird der Status jedoch nicht an IPS gemeldet; erst nach dem Ausführen von GetValueBoolean wird der Wert auch in der Console aktualisiert.
Ist das normal oder ist hier evtl. seitens Elektriker noch nachzuarbeiten?
Vielen Dank an alle für die Hilfe.
Wäre es generell auch möglich alle Variablen anhand beispielsweise eines Präfix „Kontakt_“ auf einmal zu lesen?
Gruß Johannes
EDIT: Aus irgendeinem Grund erhalte ich nun die Statusmeldung auch ohne Zutun direkt in IPS. Woran es liegt kann ich nicht nachvollziehen. Bis auf oben genannte Lösungsvorschläge wurde meinerseits nichts unternommen.
Kenne mich leider mit KNX/EIB nicht wirklich gut aus, bekomme nur ab und an was bei einem Bekannten mit, aber wenn ich mich nicht total falsch erinnere, dann sollten die Aktoren an Fenster/Türen ihren Status automatisch ins EIB schicken und dann sollten auch automatisch die Variablen aktualisiert werden, so dass man nur noch mit $status = GetValue(12345); den Variablen-Status abfragen muss…
Bzgl. alle zusammen abfragen, das Thema haben wir gerade hier >> Frage: Ereignis triggern basierend auf Variablenprofil
…ich persönlich habe dazu ein Skript, in diesem Frage ich alles ab und setze damit andere Variablen und habe als ausgelöstes Ereignis alle meine Kontakte eingetragen und prüfe diese auf Variablenänderung (setzt aber voraus, dass die automatisch bei dir im IPS geändert werden).
Deine Variablen unterhalb der EIB Instanz wird ja automatisch angelegt, oder?! …die einfach umbenennen geht nicht! Schau mal in den von mir verlinkten Thread, da wird wie gesagt drüber geschrieben und kannst du für dich übernehmen.
wenn die KNX-Anlage ordentlich programmiert ist und alles korrekt in IPS eingepflegt ist, benötigt man den Befehl EIB_RequestStatus nicht, da IPS permanent auf den Bus hört und alle Telegramme mitkriegt. Das gilt für Lichter genau so wie für Binäreingänge, etc.
Ich nutze diesen Befehl z.B. nur im Startscript von IPS um die wichtigsten Status vom Bus in IPS zu kriegen.
Ich sehe mir den Thread dann noch an.
Bei mir ist es nun momentan wirklich so, dass alle Zustände, egal ob Licht, Rolladen oder Kontakt automatisch an den BUS kommen.
Ich habe vermutlich einfach die falschen Kontakte getestet. Da ich hier bei 10 Kontakten bereits zwei habe die gar nicht funktionieren und einen habe der schließt statt öffnet, kann das durchaus sein.
@Chris: Variablen die aus dem ETS-Export kommen kann ich bei mir umbenennen.
@Christoph: Kannst du nochmal genauer Erläutern warum du EIB_RequestStatus beim starten von IPS verwendest obwohl doch alle Stati auf den Bus kommen?
Oder ist es so, dass IPS hier über das Gateway nur mitliest und du beim starten das ganze synchron kriegen willst, wenn IPS länger nicht lief?
Wenn du die Variablen umbenennen kannst, dann könntest du die alle suchen lassen und abfragen in einem kurzen Skript. Quasi grob so in der Richtung (nur auf EIB anpassen und mit was davor/danach, falls du irgendwo unterscheiden willst usw.):
// Liest von allen HomeMatic Geräten den aktuellen STATE aus
$instanceIdList = IPS_GetInstanceListByModuleID("{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}");
foreach ($instanceIdList as $instanceId) {
$variableId = @IPS_GetVariableIDByName('STATE', $instanceId);
if ($variableId!==false) {
set_time_limit(10);
@HM_RequestStatus($instanceId, 'STATE');
}
}
Den RequestStatus beim Start von IPS macht man, damit man direkt alle Status-Variablen richtig hat. Ansonsten würden die erst Zeit mit Zeit oder bei der nächsten Änderung eintrudeln und sich dann erst aktualisieren… Weil IPS nur im Bus mitliest.
Richtig, IPS bekommt die Meldungen vom Bus nur mit, wenn es auch läuft. Wenn es startet, lief es vorher nicht (Reboot oder ähnliches), weshalb ich mir die wichtigen Status dann beim Start anfordere.
Auch wenn es jetzt leicht OT ist muss ich da mal rein:
Natürlich kann man alle IPS-Variablen umbennen, sind ja auch nur ‚Objekte‘.
Eine Abfrage mit IPS_GetVariableIDByName ist dann aber nicht mehr möglich.
Darum sollte man immer mit den IDENT arbeiten um Objekte unterhalb von Instanzen zu finden; gerade bei HM.
Und sich die Freiheit der Namensvergebung nicht zu verbauen.
Soll ich etwa alle Scripte ändern, weil meine Tochter bald in das DG zieht und ich die Objekte umbenenne ?
das mit den EIB Variablen umbenennen wurde ja schon aufgeklärt, dachte das wäre wie bei HM, dass sich alles selbst anlegt usw…
Kannst du das bitte nochmal genauer erklären, was meinst mit „Darum sollte man immer mit den IDENT arbeiten um Objekte unterhalb von Instanzen zu finden; gerade bei HM“? Mache ich da was falsch/ungünstig?
Bei HM werden die Variablen ja immer von alleine angelegt, diese liegen bei mir im „Hardware-Bereich“ und werden nicht umbenannt/verschoben/… Von da verlinke ich nur raus oder frage aus meinem Skript-Teil daraus Zustände ab, schalte Aktoren über die Instanzen, …
Wenn also ein Raum sich ändert, z.B. von Gästezimmer in Kinderzimmer, dann muss ich da z.B. nur die Namen dem der Verlinkung ändern, darunter die Aktoren ändern sich ja nicht… Oder verstehe ich grad nur Bahnhof?
Habe ich was von verschieben gesagt :eek:
Das geht doch gar nicht.
Umbennen schon, und ist auch so gewollt. Warum soll bei der Lampe STATE stehen und nicht ‚Deckenlicht Wohnzimmer‘ ?
IPS vergibt immer erst mal einen Namen, so auch bei KNX und wenn da nur Value steht.
Die Instanzen finden Ihre Status-Variablen über den IDENT und können Ihn so auch zuordnen wenn er ‚Grützwurst‘ heißt. Also sollte man sich das bei generischen Scripten (welche also nicht mit Objekt-IDs arbeiten) auch angewöhnen.
Der IDENT wird immer in Instanzen unter dem Reiter ‚Statusvariablen‘ angezeigt und darf (sollte stimmt eher) nicht verändert werden.
Klar kann das Ding als Link wieder anders heißen. Und ja ich baue meine Visu auch nur mit Links. Aber es ging hier um Scripte nicht um Visu und Links.
Davon abgesehen ist es bei den Graphen unschön wenn du der Variable keinen Namen gibst. Dann steht da nicht Luftfeuchte Kind 1 sondern nur ‚HUMIDITY‘ als Titel.
// Findet 'STATE' auch wenn es 'Grützwurst' heißt
IPS_GetObjectIDByIdent('STATE',123456);
// Findet 'STATE' nur wenn es auch 'STATE' heitßt:
IPS_GetObjectIDByName('STATE',123456);
IPS_GetVariableIDByName('STATE',123456);
Jetzt verstehe ich was du meinst Licht geht auf Danke für die Aufklärung
Ich mach das alles irgendwie anders. Wobei das mit den IDENT Dingern schon logisch und gut klingt… Mal bei Gelegenheit genauer untersuchen. Gibt es da eigentlich zu so Dingen eine Art „best practice“? Wäre sinnvoll… So kocht irgendwie (bis auf die Projekte im Forum), jeder sein eigenes Süppchen und joa… Mal im Doku Thread was dazu schreiben