Projektvorstellung: pmatic (Homematic + Python)

diverse Zusatzsoftware

Moderator: Co-Administratoren

LaMi
Beiträge: 16
Registriert: 09.02.2016, 20:00

Projektvorstellung: pmatic (Homematic + Python)

Beitrag von LaMi » 10.02.2016, 20:50

Guten Abend zusammen,

als Einstiegspost in diesem Forum möchte ich euch mein Projekt pmatic vorstellen, das ich vor ein paar Wochen begonnen habe. Ich bin in das Thema durch endlosen Frust mit dem Krampf, der sich Homematic-Script nennt, hinein gerutscht. Eigentlich wollte ich ja nur eine Alarmierung per Pushover an mein Handy senden, wenn Fenster zu lange offen sind. Aber diese Syntax. Aber die kaum vorhandenen Debuggingmöglichkeiten, aber, aber, aber. Ich bin mir sicher, dass diesen Frust einige nachvollziehen können :wink:.

Was ist pmatic nun?

Pmatic besteht aus mehreren Komponenten. Da ist zunächst das Kernstück, das pmatic-Modul. Dies ist eine Python-Bibiliothek, mit der Zugriff auf die CCU und die von ihr verwalteten Geräte ermöglicht wird. Die Programmierschnittstelle ist so gebaut, dass die Scripte z.B. auf einer Linux-Workstation (oder sogar Windows) mit Python entwickelt werden können und später, ohne Änderung, auf der CCU ausgeführt werden können. Das macht die Entwicklung sehr einfach und komfortabel, da man mit beliebigen Editoren und Tools arbeiten kann.

Weiterhin gibt es noch den pmatic Manager, der als eigenständiger Prozess auf der CCU läuft und ein dediziertes Webinterface anbietet, über das man seine Scripte auf der CCU verwalten und steuern kann. Aktuell kann man die vorhandenen Scripte auflisten, herunterladen, neue hochladen und löschen. Die Scripte kann man manuell ausführen und deren Ergebnisse direkt in der Weboberfläche ansehen noch während das Script läuft. In den nächsten Wochen werde ich hier wohl noch eine Zeit- und Event-basierte Steuerung für die Scripte einbauen. Der Manager ist komplett optional, d.h. man kann das pmatic-Modul auch selber nutzen und alles auf der Kommandozeile etc. machen.

Der letzte Punkt ist, dass das obige alles schön als Addon-Paket für die CCU paketiert ist. d.h. das Installieren und Ausprobieren ist ein Kinderspiel. Auch für die Installation auf eurer Linux-Workstation steht ein Archiv bereit. Mehr Infos erhaltet Ihr in der Dokumentation.

Nun werden sich einige wundern. Python auf der CCU? Naja, geht schon. Ist nur per Default nicht mit dabei. Ich habe Python zusammen mit den benötigten Modulen so eingepackt, dass man nach der Installation des pmatic-Pakets ganz normal Zugriff auf den Python-Interpreter hat und auch seinen eigenen Krams - unabhängig von pmatic - in Python implementieren kann. Da Python eine bekanntlich sehr schöne Programmiersprache für Programmieranfänger ist, bin ich mir sicher, dass das einigen gefallen wird.

Ich habe bei der Programmierschnittstelle von pmatic darauf geachtet möglichst saubere Strukturen aufzuziehen. Ich hoffe das ist mir damit gelungen. Die Beispielscripte geben eigentlich auch einen schönen Einblick. Das pmatic-Modul selbst ist noch lange nicht vollständig. Dinge wie Zugriff auf Systemvariablen der CCU sind möglich, bisher aber einfach noch nicht drin.

Hier noch ein paar relevante Links:

Dokumentation: https://larsmichelsen.github.io/pmatic/doc/index.html
Webseite: https://larsmichelsen.github.io/pmatic/
GitHub-Seite: https://github.com/LarsMichelsen/pmatic
Bugtracker: https://github.com/LarsMichelsen/pmatic/issues

Nun bin ich auf Kommentare, Anregungen, Rückmeldungen und Fragen gespannt.

Grüße
Lars
Zuletzt geändert von Roland M. am 02.09.2018, 22:30, insgesamt 2-mal geändert.
Grund: Thema verschoben

MartinF
Beiträge: 6
Registriert: 02.03.2015, 00:13

Re: Projektvorstellung: pmatic (Homematic + Python)

Beitrag von MartinF » 17.02.2016, 15:56

Hallo Lars,
vielen Dank für deine Arbeit! Hatte schon überlegt mich selbst am Python Support für die CCU zu versuchen aber bin dann glücklicherweise auf dein hervorragendes Addon gestoßen!
Die Idee mit der generischen pmatic Bibliothek lokal und per remote mit der CCU zu kommunizieren finde ich super! Ich werde das demnächst mal genauer ausprobieren.

Bei der Installation des Addon schien der Ordner /usr/local/bin zu fehlen, dazu habe ich bei Github gerade einen Bug Report erstellt.

Einen ersten Feature-Wunsch habe ich auch schon: Systemvariablen in pmatic. Die Abfrage über api.call() klappt, aber eine Integration wie die Geräte wäre noch bequemer.

Code: Alles auswählen

import pmatic
ccu = pmatic.CCU(address="<URL>", credentials=("Admin", "<PW>"))
sys_vars = ccu.api.call('sys_var_get_all')
print sys_vars
Oder gibt es das bereits und ich habs übersehen?

Gruß
Martin

hobbyquaker
Beiträge: 3978
Registriert: 12.07.2009, 20:01
Hat sich bedankt: 17 Mal
Danksagung erhalten: 176 Mal
Kontaktdaten:

Re: Projektvorstellung: pmatic (Homematic + Python)

Beitrag von hobbyquaker » 17.02.2016, 18:07

Saugut. Alles vorbildlichst, 1a dokumentiert, super Konzepte, ganz großen Respekt!

hobbyquaker
Beiträge: 3978
Registriert: 12.07.2009, 20:01
Hat sich bedankt: 17 Mal
Danksagung erhalten: 176 Mal
Kontaktdaten:

Re: Projektvorstellung: pmatic (Homematic + Python)

Beitrag von hobbyquaker » 17.02.2016, 18:11

MartinF hat geschrieben:Einen ersten Feature-Wunsch habe ich auch schon: Systemvariablen in pmatic.
Ich würde an der Stelle anmerken dass Du evtl Deine "Systemarchitektur" überdenken solltest. Pmatic bietet Dir die Möglichkeit die ReGa vollständig von Variablen, Programmen und Scripten zu befreien. Das ist das einfachste/problemloseste und unbedingt empfehlenswerte Rezept für Stabilität bei der Nutzung einer CCU. Nutze diese Möglichkeit! ;-)

LaMi
Beiträge: 16
Registriert: 09.02.2016, 20:00

Re: Projektvorstellung: pmatic (Homematic + Python)

Beitrag von LaMi » 17.02.2016, 19:55

Hallo zusammen,

@Martin: Danke für deine Rückmeldung. Hab den Fehler bereits gefixt, nur noch nicht ausprobiert. Sollte aber tun.

Das mit den Variablen ist im Prinzip schon über die "low_level"-API möglich. Du hast es ja fast schon herausgefunden. Schau mal im Git unter examples/lowlevel_api. Dort sind ein paar Beispiele dieser API zu finden. Die Lowelevel-API ist im Grunde nur ein kleiner Wrapper um die API der Homematic ohne weitere Abstraktion.

Hiermit kannst du z.b. alle verfügbaren Methoden von pmatic.api in Verbindung mit deiner CCU auflisten:

Code: Alles auswählen

import pmatic.api

pmatic.api.init(
    address="http://192.168.1.26",
    credentials=("Admin", "EPIC-SECRET-PW")).print_methods()
Und dann kann man z.b. sowas machen:

Code: Alles auswählen

import pmatic.api

api = pmatic.api.init(
    address="http://192.168.1.26",
    credentials=("Admin", "EPIC-SECRET-PW"))

print(api.sys_var_get_all())
Auf das API-Objekt kannst du auch vom CCU-Objekt aus "durch greifen":

Code: Alles auswählen

import pmatic
ccu = pmatic.CCU(address="<URL>", credentials=("Admin", "<PW>"))
sys_vars = ccu.api.sys_var_get_all()
print(sys_vars)
Eine Abstraktion habe ich aber schon angedacht, möchte aber vorher noch den pmatic Manager etwas aufbohren, so dass man die hochgeladenen Scripte Event- bzw. Zeitgesteuert starten lassen kann.

Zum Thema Datenspeicherung schwebt mir im pmatic Manager eher eine Art "local store" vor, der als Key/Value-Datenbank beliebige Python-Datenkonstrukte (Einzelwerte, Listen, Dictionaries, ...) persistieren kann. Das ist sehr einfach umzusetzen und zu als Script-Entwickler einfach zu bedienen. Man kann von allen seinen Scripten einer pmatic-Manager-Instanz darauf zugreifen und die Speicherung der Daten ist Typsicher. Mehr braucht man eigentlich nicht.

Der einzige Vorteil, den die Speicherung in der CCU hätte wäre, dass man von verschiedenen Systemen auf einen zentralen Speicher zugreifen kann. Aber ich schätze mal, dass das für die wenigsten Anwendungsfälle wirklich relevant ist.

@hobbyquaker: Danke für die Blumen! Insbesondere mit der Dokumentation habe ich mir Mühe gegeben. Und es ist immer noch viel Verbesserungspotential da.

Solche Kommentare schaffen gleich wieder Motivation! Bin auf weitere Rückmeldungen gespannt!

Grüße
Lars

MartinF
Beiträge: 6
Registriert: 02.03.2015, 00:13

Re: Projektvorstellung: pmatic (Homematic + Python)

Beitrag von MartinF » 18.02.2016, 00:55

@Lars: Vielen Dank für die Beispiele, das geht ja noch einfacher als ich dachte!
Der pmatic-manager läuft bei mir leider nicht (ImportError bei inspect), habe dafür wieder einen Bug Report bei Github erstellt.
hobbyquaker hat geschrieben: Ich würde an der Stelle anmerken dass Du evtl Deine "Systemarchitektur" überdenken solltest. Pmatic bietet Dir die Möglichkeit die ReGa vollständig von Variablen, Programmen und Scripten zu befreien.
Damit hast du vermutlich Recht, muss ich mal drüber nachdenken... :wink:
Die erste pmatic Anwendung soll ein Webhook für Geofences sein (bei mir Geofency+iOS). Ursprünglich hatte mein NAS eine Systemvariable der CCU gesetzt und damit ein Programm angestoßen. Konsequent wäre also die Geräte gleich direkt über pmatic anzusteuern.

Ohne jetzt mit konkreten Implementierungsdetails diesen Thread zu überfluten, wie würde man ein solches Python Programm auf der CCU von "außen" ansprechen?
(A) per cgi über den lighthttpd, (B) als eigener Daemon mit offenem Port oder gibt es eine ganz andere Alternative?

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

Re: Projektvorstellung: pmatic (Homematic + Python)

Beitrag von jmaus » 18.02.2016, 17:45

LaMi hat geschrieben: Nun bin ich auf Kommentare, Anregungen, Rückmeldungen und Fragen gespannt.
Eine wirklich sehr gute und runde Sache so wie es aussieht. Und in der Tat habe ich auch bereits seit einiger Zeit mit dem Gedanken gespielt etwas ähnliches zu implementieren damit man python skripte von der CCU aus nutzen kann und die leidigen Bugs die leider in ReGaHSS stecken damit hoffentlich automatisch los wird. Auch hatte ich witzigerweise die selbe Idee wie du, ein CCU-Addon zu schreiben das dann über ein extra Webinterface es erlaubt die Python-Skripte zu verwalten um somit auch den Otto-Normal-Verbrauchern eine Möglichkeit zu geben das ganze zu nutzen.

Interessant würde ich es auch noch finden wenn man eine Möglichkeit implementieren würde die es erlaubt auch innerhalb der WebUI dann die programmierten Python-Skripte von der CCU getriggert ablaufen zu lassen. D.h. man könnte dann zumindest die einfachen WebUI Verknüpfungen und sogar Direktverknüpfungen z.B. nutzen um dann statt eines HM-Skriptes einfach ein Python script ablaufen zu lassen. Dazu hast du dir sicher auch schon Gedanken gemacht. Mir würde so etwas vorschweben wie ein einfacher CUxD Aufruf. D.h. man würde einfach nur ein einzelnen dom.GetObject() Aufruf mit einem CUxD Aufruf tätigen der dann das besagte python script ablaufen lässt und dort drin dann alles weitere erledigt.

Wirklich sehr interessant wie sich doch Entwicklungsideen überschneiden können :) und ich finde es super das du hier den ersten Schritt getan hast und wohl auch bereits sehr weit gekommen ist. Ich werde mir das definitiv in nächster Zeit einmal detaillierter anschauen und sicher auch den Einen oder anderen Pullrequest dann in deine Richtung schicken um dir unter die Arme zu greifen.

Danke also für dieses neue Projekt das wirklich sehr vielversprechend aussieht und die HomeMatic-Platform sicher sehr bereichern wird!
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

LaMi
Beiträge: 16
Registriert: 09.02.2016, 20:00

Re: Projektvorstellung: pmatic (Homematic + Python)

Beitrag von LaMi » 19.02.2016, 10:14

@MartinF: Wird so langsam. Der Import-Fehler ist inzwischen behoben. Ich muss mir dafür einfach Tests überlegen, dass das nicht andauernd wieder passiert, wenn man neue Modulabhängigkeiten hinzufügt. Auf der CCU werden aktuell nur selektiv die benötigten Python-Module installiert. Daher der Fehler.
Ohne jetzt mit konkreten Implementierungsdetails diesen Thread zu überfluten, wie würde man ein solches Python Programm auf der CCU von "außen" ansprechen?
(A) per cgi über den lighthttpd, (B) als eigener Daemon mit offenem Port oder gibt es eine ganz andere Alternative?
Dafür ist im Grunde der pmatic-Manager da. Dort gibt es jetzt schon eine "Execute Script"-Seite. Diese kann man theoretisch aktuell bereits von außen ansprechen, dafür muss man aber einen HTTP POST absetzen und sich vorher einloggen. Aber dafür könnte man auch gut eine explizite Schnittstelle bauen, so dass das komfortabler wird.

@Jens: Danke für deinen Kommentar!
Interessant würde ich es auch noch finden wenn man eine Möglichkeit implementieren würde die es erlaubt auch innerhalb der WebUI dann die programmierten Python-Skripte von der CCU getriggert ablaufen zu lassen.
Genau daran arbeite ich aktuell. Der pmatic Manager macht seit gestern bereits eine XML-RPC-Schnittstelle auf und hört dort auf eingehende Events. Diese kann man sich in der GUI auch unter "Event Log" bereits anzeigen lassen. Als nächstes kommt ein Konfigurationsdialog, mit dem der Nutzer bestimmen kann unter welchen Bedingungen ein Script gestartet werden soll.
Mir würde so etwas vorschweben wie ein einfacher CUxD Aufruf. D.h. man würde einfach nur ein einzelnen dom.GetObject() Aufruf mit einem CUxD Aufruf tätigen der dann das besagte python script ablaufen lässt und dort drin dann alles weitere erledigt.
Der CUxD ist ja ein separates Addon, das ich mir bisher nicht im Detail angeguckt habe. Deswegen ist mir auch nicht so klar, was genau die Vorteile einer Integration mit dem CUxD wären? Ich versuche die Abhängigkeiten von pmatic so gering wie möglich zu halten. d.h. der pmatic Manager sollte nicht erzwingen, dass man einen CUxD laufen hat.

Natürlich kann man lokal die Python-/pmatic-Scripte ohne Probleme auch vom lokalen Cron oder CUxD oder anderen Programmen aus triggern lassen. Der pmatic Manager ist ja nur eine optionale Komponente.

Grüße
Lars

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

Re: Projektvorstellung: pmatic (Homematic + Python)

Beitrag von jmaus » 19.02.2016, 13:23

LaMi hat geschrieben: Natürlich kann man lokal die Python-/pmatic-Scripte ohne Probleme auch vom lokalen Cron oder CUxD oder anderen Programmen aus triggern lassen. Der pmatic Manager ist ja nur eine optionale Komponente.
Ich glaube ich hab mich etwas ungenau ausgedrückt was genau ich mir da vorstelle. Und zwar stelle ich mir vor, dass man innerhalb eines HomeMatic-Skriptes (in der WebUI) eine Möglichkeit hat dann auch python skripte direkt aufzurufen. D.h. also es sollte am besten in pmatic dann eine Möglichkeit geben die standardmäßige WebUI Programmierung von der CCU weiter zu nutzen und dann einfache Gerätebedingungen usw. abzubilden. So wäre die momentan einfachste Art wohl man schreibt quasi statt eines gesamten/komplexen HomeMatic Skriptes in den SkriptEditor der WebUI eine einfache Zeile wie folgende rein:

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("/usr/local/addons/pmatic/user-scripts/Script.py $src$");
Dies würde dann CUxD anweisen den besagten Python script auszuführen und über $src$ würde der sogar eine Referenz zu dem Objekt bekommen der das Skript ausgelöst hat. Das kann man natürlich beliebig erweitern und dann sogar rückgabewerte an den HM-Skript zurückgeben usw. Ggf. könnte ja auch der Macher von CUxD (uwe111) ein extra virtuelles "pmatic" Device in einer neuen version generieren sodass man direkte Geräte<>Geräte Verknüpfungen machen könnte und dann würde man quasi bei einer Statusänderung eines Kanals eines Gerätes automatisch den besagten python skript aufrufen lassen.
Und dann führt CUxD hier eben diesen Skript entsprechend aus.
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

LaMi
Beiträge: 16
Registriert: 09.02.2016, 20:00

Re: Projektvorstellung: pmatic (Homematic + Python)

Beitrag von LaMi » 20.02.2016, 14:02

Ich glaube ich hab mich etwas ungenau ausgedrückt was genau ich mir da vorstelle. Und zwar stelle ich mir vor, dass man innerhalb eines HomeMatic-Skriptes (in der WebUI) eine Möglichkeit hat dann auch python skripte direkt aufzurufen. D.h. also es sollte am besten in pmatic dann eine Möglichkeit geben die standardmäßige WebUI Programmierung von der CCU weiter zu nutzen und dann einfache Gerätebedingungen usw. abzubilden. So wäre die momentan einfachste Art wohl man schreibt quasi statt eines gesamten/komplexen HomeMatic Skriptes in den SkriptEditor der WebUI eine einfache Zeile wie folgende rein:
Ah, jetzt! Klingt interessant. Was mich nur daran stört ist, dass die Script direkt aufgerufen werden und man keine einfache Möglichkeit hat die Script zu debuggen etc. Das ist ja einer meiner Hauptkritikpunkte am Homematic-Script-Krams. Oder hat man über CUxD da vernünftige Möglichkeiten?

Vom Prinzip her ginge auch das ja ohne CUxD, z.B. mit system.Exec (ungetestet):

Code: Alles auswählen

string stderr;
string stdout;
system.Exec("python /usr/local/etc/config/addons/pmatic/scripts/examples/press_button.py", &stdout, &stderr);
Dies würde dann CUxD anweisen den besagten Python script auszuführen und über $src$ würde der sogar eine Referenz zu dem Objekt bekommen der das Skript ausgelöst hat. Das kann man natürlich beliebig erweitern und dann sogar rückgabewerte an den HM-Skript zurückgeben usw. Ggf. könnte ja auch der Macher von CUxD (uwe111) ein extra virtuelles "pmatic" Device in einer neuen version generieren sodass man direkte Geräte<>Geräte Verknüpfungen machen könnte und dann würde man quasi bei einer Statusänderung eines Kanals eines Gerätes automatisch den besagten python skript aufrufen lassen.
Und dann führt CUxD hier eben diesen Skript entsprechend aus.
Scheint eine nette Idee zu sein. Wie sähe das dann aus? Würde z.b. jedes Script, das man hochgeladen hat ein Device sein, oder gäbe es ein generelles pmatic-Device, das sich dann parametrisieren lässt? Oder wäre dort jedes Script ein Kanal?

Antworten

Zurück zu „Sonstige Addons“