Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
knx_send = die Rückmeldeadresse auf die der Wert vom "Aktor" gesendet wird
knx_listen = die Adresse auf die der "Aktor" hört
knx_reply = die Rückmeldeadresse auf der "Aktor" mit einem read mit response antwortet
Also wie geht das jetzt mit der Reaktion im Plugin auf read-requests ?
Kommt ein Lesetelegramm für ein bestimmtes item so soll der entsprechende Wert aktuell über TCP ausgelesen werden und auf den Bus gesendet werden (das ist noch nicht implementiert, habe ich aber in meinem WireGate-Plugin so gelöst.)
Das kann das Plugin nicht so einfach, es gibt einen Weg dazu später mehr.
Damit ich auch über den aktuellen Status immer auf dem laufenden bin trage ich bei item zusätzlich die Adresse knx_listen ein. Auf dieser höre ich auf Statusänderungen und aktualisiere ggf. das item....
Für mich stellt sich die Frage ob sich smarthome.py jetzt eher als Taster oder Aktor versteht.
Wer ist den für den aktuellen Status verantwortlich? Ich denke in diesem Fall SH.py und ist daher Aktor. Das wiederspricht dann aber dem Satz mit knx_listen. Das listen dient zu Steuerung (durch Sensoren).
knx_reply ist im Endeffekt mit dem Read-Flag von KNX vergleichbar.
Also noch mal langsam sonst komm ich durcheinander
Ich versuche mal das Konzept zu beschreiben was am Ende rauskommen soll.
Das Plugin soll auf bestimmte GAs hören und dann deren Wert verarbeiten (über TCP senden).
Das Plugin läuft regelmäßig von allein und fragt bestimmte Werte per TCP ab. Diese Werte werden bei den bestimmten items hinterlegt und bei Änderung auf den Bus gesendet.
Kommt ein Lesetelegramm für ein bestimmtes item so soll der entsprechende Wert aktuell über TCP ausgelesen werden und auf den Bus gesendet werden (das ist noch nicht implementiert, habe ich aber in meinem WireGate-Plugin so gelöst.)
Im aktuellen Beispiel sind die 8/6/x-Adressen die Rückmeldeadressen. Wenn ich einen Wert ändern will (vom Taster oder per Visu) sende ich diesen auf 8/7/x.
Das Plugin muss also auf die 8/7/x Adressen hören und Rückmeldungen/Status an 8/6/x senden. Das Plugin ist also ein klassischer Aktor.
Nun komm ich mit der Bezeichnung der knx_xxxx hier nicht ganz klar.
Vergleiche ich das Plugin/smarthome.py/Visu mit einem Schalter und Aktor so wird doch beim Drücken eines Tasters folgendes ausgelöst:
- vom Schalter wird ein Telegramm an den Aktor gesendet (GA = knx_send)
- der Aktor sendet darauf hin eine Rückmeldung (GA = knx_listen)
Also sende ich via smarthome.py einen Wert auf das item, so sendet das KNX-Plugin diesen Wert an die Adresse knx_send.
Damit ich auch über den aktuellen Status immer auf dem laufenden bin trage ich bei item zusätzlich die Adresse knx_listen ein. Auf dieser höre ich auf Statusänderungen und aktualisiere ggf. das item.
Wenn ich nun Leseanfragen beantworten möchte muss mein item auch über knx_reply verfügen.
Für mich stellt sich die Frage ob sich smarthome.py jetzt eher als Taster oder Aktor versteht.
Edit: Das mit den DPTs ist mir klar. Das war einfach die Faulheit da ich über DPT 1.001 auch 1,2,3,4,5 übertragen bekomme, das muss ich mal ändern.
ja, wenn sich das Item ändert dann wird auch Dein Plugin aufgerufen.
Die Zeile '0.0.0 set 8/7/100 to 1' kommt vom KNX-Plugin, und hat erst einmal nichts mit dem Item zu tun.
In Deinem Log müsste 'ebusd.mode = 1 via...' CLI bzw. KNX auftauchen, das sehe ich bei Deinen Schnipseln aber nicht.
Wenn das auftaucht, wird auch Dein Plugin aufgerufen.
Zwei Dinge bzgl. Deiner Konfig würde ich überdenken:
Code:
type = num
knx_dpt = 1
tpye num ist für Zahlen gedacht. DPT 1 ist ein Bool. type = bool wäre hier passender.
Wenn ich das item via CLI "update ebusd.mode=1" update dann wird das Plugin ausgeführt und die 1 an den ebusd übergeben. Also korrekt. Natürlich nur wenn das item vorher einen anderen Wert hatte.
Code:
2013-05-20 14:42:22,919 SmartHome.py INFO eBus: called to refresh item: ebusd.mode -- __init__.py:update_item:157
2013-05-20 14:42:22,923 SmartHome.py DEBUG eBus: set parameter: value:1 cmd:cir2 mode -- __init__.py:set_parameter:78
2013-05-20 14:42:23,051 SmartHome.py DEBUG eBus: request: set cir2 mode 1 >>><<< answer: ACK -- __init__.py:_request:73
2013-05-20 14:42:23,055 SmartHome.py DEBUG eBus: command:set cir2 mode 1 -- __init__.py:set_parameter:81
2013-05-20 14:42:23,059 SmartHome.py DEBUG eBus: answer:ACK -- __init__.py:set_parameter:82
2013-05-20 14:42:23,065 SmartHome.py DEBUG 0.0.0 set 8/7/100 to 1 -- __init__.py:parse_telegram:160
Wenn ich das item via KNX mit der CometVisu ändere erhalte ich im Log "0.0.1 set 8/7/100 to 1 -- __init__.pyarse_telegram:160". Soweit korrekt.
Nach meinem Verständnis müsste doch aber jetzt auch das Plugin aufgerufen werden ? Auch hier gehen wir davon aus dass das item vorher einen anderen Wert hat.
Code:
2013-05-20 14:45:01,373 SmartHome.py DEBUG 0.0.1 set 8/7/100 to 1 -- __init__.py:parse_telegram:160
Müsste hier nicht auch mein "eBus: called to refresh item: ebusd.mode" auftauchen ?
Danke für den knx_reply Hinweis:
Ein Lesen der knx_reply erzeugt dann den Aufruf:
Über das CLI kann ich auch mit "update ebusd.mode=1" in diesem Fall die Betriebsart ändern. Bei einem späteren zyklischen Auslesen ist alles korrekt,
Ich sehe im Log auch den Erfolg:
So weit so gut. Nun dachte ich dass ein einfaches senden einer "1" auf 8/7/100 das gleiche macht und ich mit 8/6/100 das item lesen kann - geht aber nicht.
Grüße
Hier noch mein erstes Plugin:
PHP-Code:
#!/usr/bin/env python
# vim: set encoding=utf-8 tabstop=4 softtabstop=4 shiftwidth=4 expandtab
#########################################################################
# Copyright 2012-2013 KNX-User-Forum e.V. https://knx-user-forum.de/
#########################################################################
# This file is part of SmartHome.py. http://smarthome.sourceforge.net/
#
# SmartHome.py is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# SmartHome.py is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with SmartHome.py. If not, see <http://www.gnu.org/licenses/>.
#########################################################################
if not self.is_connected:
return
start = time.time()
if len(self._attribute) > 0:
#logger.debug("eBus: attributes: {0}".format(self._attribute))
val = self.refresh_attributes()
#logger.debug("eBus: refreshed value {0}".format(val))
if self.id >= len(self._attribute):
self.id = 1
else:
self.id += 1
#logger.debug("eBus: next cycle-id: {0}".format(self.id))
cycletime = time.time() - start
#logger.debug("eBus: number of attributes {0}".format(len(self._attribute)))
#logger.debug("cycle takes {0} seconds".format(cycletime))
def parse_item(self, item):
if 'ebusd_type' in item.conf: # Attribute und Parameter werden regelmäßig ausgelesen
ebus_type = item.conf['ebusd_type']
ebus_cmd = item.conf['ebusd_cmd'] # Wert hinter "ebusd_cmd = "
self._attribute[ebus_type,ebus_cmd] = item # makes array
logger.debug("eBus: new set = item:{0} type:{1} cmd:{2}".format(item,ebus_type,ebus_cmd))
return self.update_item
def update_item(self, item, caller=None, source=None):
if caller != 'eBus':
logger.info("eBus: called to refresh item: {0}".format(item))
self.set_parameter(item.conf['ebusd_cmd'], item())
o.k. nächste Frage ... Wie übergebe ich den Wert eines item ?
PHP-Code:
def refresh_parameters(self):
self.refresh_id = 1
for p in self._parameter:
request = p
if self.refresh_id == self.id:
answer = self._request(request, 8)
logger.info("eBus: Parameter/Refresh {0}/{1}".format(self.id,self.refresh_id))
return answer
else:
self.refresh_id +=1
logger.info("eBus: Parameter/Refresh {0}/{1}".format(self.id,self.refresh_id))
Ich durchlaufe self._parameter um beim dritten Durchlauf eben das dritte Element abzufragen ... die Schleife und das drumherum funktioniert. Ich bekomme auch eine Antwort (answer).
Diese Antwort möchte ich jetzt dem item zuweisen und hier stehe ich auf dem Schlauch.
Also irgendwie muss ich doch "answer" dem item zuweisen können ... so ganz blick ich da noch nicht durch.
Alle Variablen die du im Plugin mit self.variablenname setzt sind Instanzvariablen und können beim nächsten Aufruf einer Methode wieder mit self.variablenname abgefragt werden. Geht natürlich nur in Klassenmethoden die als ersten Parameter self übergeben bekommen.
Gibt es eine Möglichkeit eine Variable zu definieren die die gesamte Laufzeit von sh.py überlebt?
Ich möchte die Anzahl der auszulesenden Werte ermitteln und dann hochzählen so dass bei z.B. 5 Werten verteilt auf 5 Minuten jede Minute ein anderer Wert ausgelesen wird.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Einen Kommentar schreiben: