Posts by miriki

    die 4 links sind turbo dauer feuer usw... must die 4 butteon aud K1 K2 K3 K4 legen ... das ist quasi butten a b x y

    Ja, das war mir schon klar, dass es die sein _sollen_. Aber: Wenn ich einen Taster da ranhänge, reagiert kein Input am PC auf den. Beispiel: Ich öffne die "Gamecontroller" Einstellungen in Windows 10. Dort wird mir ein Joystick mit 12 Buttons und "Rundblickschalter" (aka Coolie Hat) angezeigt. Die 2 Achsen des Joysticks und die 12 Tasten der Reihe gegenüber funktionieren und und zeigen Reaktion.


    Aber wenn ich die 4 Taster links anstöpsel, bekomm ich nirgends eine Reaktion, auch nicht als K1 .. K4, was ja auch blöd wäre, da es die ja schon bei den 12 anderen gibt.


    Quote

    und die schwarzen verstehe ich nicht ... der eine schwartze sitzt auf den richtungstasten...

    ichhabe 4 von den bord und die laufen alle sehr gut.


    Ich hab nur Taster drauf, weil's zum ausprobieren handlicher als der Joystick ist. Am Joystick sitzen ja letztendlich auch nur 4 Taster, wie unter den Buttons auch.

    Moinsens!


    Ich hab hier so eine Adapter-Platine, die einen (digitalen) Joystick und 12 Tasten per USB verfügbar macht.

    ( ob der 5-polige J4 auf einen analogen Joystick reagiert, kann ich z.Z. nicht ausprobieren. )


    Aber ich kriege die 4 Tasten rechts nicht dazu, irgendwas zu melden. Kann mir da jemand 'n Trick verraten?


    Die schwarzen Taster geben an allen benachbarten Steckern Reaktion. Aber die 4 roten wollen partout nicht.


    Gruß, Michael

    Quote from Oumma

    du musst auf dem display hin und her wischen.

    Oh, das hab ich - gedrückt, geklopft, gewischt, ... Wenn das Ding an der CLI abschaltet, krieg ich ihn damit auch nicht wieder zurück. In der GUI ist das alles kein Thema, da geht es.


    Quote

    um das display wieder zu aktiviren erstellst du eine grafische benutzeroberfläche ...

    ähm... CLI ;)


    Wobei, pseudo-grafisch kann's werden, da ich eigentlich eine Textmodus-Oberfläche per Python curses als Dashboard auf dem Ding laufen lassen möchte. Da sollen dann auch Buttons auf Click, also Touch in diesem Fall, reagieren.


    Code
    vcgencmd display_power 0

    Ich kann's jetzt gerade nicht ausprobieren, weil der RasPi z.Z. völlig ohne Peripherie verstaut ist und sich erstmal nur um ioBroker kümmert. Aber ich war schon über vcgencmd gestolpert. Irgendwas ging da aber nicht. display_power nur an HDMI? kein display_power ohne x display? ich weiß es nicht mehr, aber das wollte auf alle Fälle nicht. Und per SSH bringt's das ja auch nicht. ;)


    Gruß, Michael

    Moinsens!


    Vielleicht kann mir ja hier jemand helfen...


    Ich habe einen Pi 3b+ (bullseye) mit 7" touch display. Es hängt keine Tastatur oder Maus an dem Rechner. Ich adminstriere den eigentlich nur per Putty SSH.


    Ich probiere gerade ein bisschen, mit python und curses ein minimalistisches Dashboard zu bauen. Auf einigen, wenigen Seiten sollen Info über Heizkörper, 3D-Drucker usw. angezeigt werden. Diese Informationen kommen aus ioBroker. Das funktioniert soweit auch alles, ist nicht das Problem.


    Ich habe in /boot/cmdline.txt die Ergänzung "consoleblank=300" eingetragen, damit der Pi nach 5 Min. den Bildschirm abschaltet. Auch das funktioniert, aber...


    Wie krieg ich den Bildschirm wieder an? Nur auf einen Patsch auf den Touch reagiert der Pi nicht.


    Gibt's irgendwo noch eine Einstellung oder muss ich einen Dienst installieren, damit ich nach einem Fingerdruck auf das Display auch wieder was lesen kann?


    Gruß, Michael

    Naja, schrieb ich ja: Tuya Adapter ist im ioBroker, aber bleibt gelb. Etwas detaillierter:

    - Nach mehrmaligem Aufruf der Seite kamm irgendwann, dass ich meine Identität per Fingerabdruck bestätigen soll. Heissa!

    - Zertifikat ist für VPN und WLAN jeweils installiert (vorsichtshalber).

    - Handy WLAN ist mit Proxy 192.168.1.151:8888 versehen.

    - Chrome zeigt mir schonmal keine Website mehr an.

    - LSC (die Handy App) sagt, dass es das Netz (den Proxy) nicht verwenden kann.

    - ioBroker bzw. der tuya-Adapter macht keinen Mucks, der QR-Code bleibt auf dem Schirm.

    - ioBroker Proxy beendet, WLAN-Proxy wieder raus und zu den Akten bis weitere Erkenntnisse ;)


    Gruß, Michael

    Moinsens!


    Ich würd hier gerne mal einen "push" machen, da ich über 130 Zugriffe sehe, aber nicht eine Antwort kommt. Ich kann doch nicht der Einzige (oder Erste) sein, dem sich diese Frage stellt.


    Ich würde es gerne auch noch auf die Geräte "Smart LED flood light with sensor" und "Smart rotatable camera" erweitern.


    Bei der Kamera habe ich tlw. Ergebnisse mit z.B.

    Code
    rtsp://admin:admin@192.168.1.151:8554/Streaming/Channels/101

    bzw. 102, siehe

    Kamera RTSP (community.home-assistant.io)


    Jemand?


    Gruss, Michael


    Moinsens!


    Vielleicht mal ein ganz anderer Ansatz, bei dem man nicht gleich brutal irgendwas "töten" muss ;)


    Sagt die der Begriff "Semaphore" etwas? Das sind 0-Byte-Dateien, also nur Einträge im Verzeichnis, aber ohne Inhalt. Das (Nicht-) Vorhandensein eines Semaphores kann man benutzen, um Aktionen (nicht) auszuführen. DOS-Fenster: "rem. > semaphore.txt" würde so ein Ding z.B. erzeugen.


    Grob gesagt: Dein "Handbetrieb" Script erzeugt beim Start ein Semaphore "manuell" und fragt dann ein Semaphore "automatic" ab. Solange dies existiert, wird es erneut abgefragt. Wenn es nicht (mehr) vorhanden ist, kann das Script durchstarten. Das "Loop" Script seinerseits erzeugt beim Start ein "automatic" Semaphore und fragt regelmäßig das Vorhandensein eines "manuell" Semaphore ab. Findest es dieses, dann wird zum definierten Ende der Loop verzweigt und am Ende das "automatic" Semaphore gelöscht. Das "Handbetrieb" Script seinerseits löscht beim Beenden das "manuell" Semaphore. So hast Du eine rudimentäre Kommunikation zwischen den beiden Scripten und gewährleistest, dass nur eines zur Zeit aktiv ist. Das "Loop" Ende könnte natürlich auch auf das Verschwinden von "manuell" warten und dann wieder zum Start springen.


    Ein guter Platz für die Semaphores könnte /var/tmp oder /var/local/ oder /tmp sein. Auch /var/run (/run) wäre möglich. die *.pid, *.lock und *.sock Dateien dort sind auch eine Art Semaphore, nur ggf. noch mit Inhalt.


    Michael

    Moinsens!


    Gibt es eigentlich eine Möglichkeit, die Steckdosen von "action" im iobroker anzeigen und ev. auch bedienen zu können? Es handelt sich dabei um "Smart Power Plug" aus der Serie "LCS Smart Connect". Mit einer App für's Handy läßt sich die Steckdose problemlos finden und benutzen.


    Ich hab ein wenig gesucht, aber ich komm nicht so recht klar. Einige reden von "aufmachen und flashen", was ich gerne vermeiden würde. Andere sagen, dass die wohl eigentlich "tuya" Geräte seien und ein Adapter in iobroker die verwalten können soll.


    Aber der Adapter mag mich (und die Steckdose) wohl nicht. Die Instanz bleibt gelb (verbunden mit Host und Lebenszeichen, aber kein Gerät). In den Einstellungen kann ich eigentlich nur "Proxy starten", was mir einen QR-Code anzeigt. Mein Handy würde dann gerne 192.168.1.151 öffnen, kriegt aber nur ERR_CONNECTION_REFUSED, auch auf den Ports 8888 oder 8889. iobroker auf Port 8081 erreiche ich ohne Probleme.


    Kann mich hier vielleicht jemand in die richtige Richtung schubsen?


    Michael

    Wenn Linux/Unix auch die Windows Sonderzeichen von Dateinamen "richtig", also in UTF8 behandeln und anzeigen soll, musst Du das beim Mounten mit der Zeichenumwandlungsoption bekanntgeben.


    Wann wo wie genau? Wie gesagt: Die Platte hängt an einem Windows-Rechner und wird über's Netz gemounted.
    Es hängt keine von Windows beschriebene Platte direkt am RasPi.


    Und ein "ls -la" auf das Mount erzeugt korrekte Darstellung, siehe Screenshot. Erst, wenn ich das Verzeichnis per PHP einlese und über Apache an den Client ausgebe, wird's Murks.


    Nochmal: Windows Apache braucht das utf8_encode der (eigenen) Dateinamen, sonst kommt Murks raus. Der RasPi wiederum reagiert allergisch darauf und produziert den Murks durch ebendieses encode. Bei der Übertragung vom Windows-Server auf den RasPi-Server aber alle Scripte anzupassen, ist nicht unbedingt ein gangbarer Weg. Ich würde lieber die Rahmenbedingungen so anpassen, daß die Scripte sich auf beiden gleich verhalten.


    Gruß, Michael

    Moinsens!


    Ich bin vor ein paar Tagen über ein Problem gestolpert, bei dem ich nicht so recht weiter weiß: Es geht um ein (etwas umfangreicheres, mehrere Klassen) PHP-Script, das schon seit einiger Zeit klaglos läuft, aber jetzt bei einer Transformation Ärger macht. Mal zuerst die Basics:


    a) Da ist ein Windows-10-Server 192.168.1.20 mit Apache 192.168.2.1, PHP und MySQL. Daran angeschlossen ist u.a. eine externe USB-Festplatte, die im intranet als "video1" freigegeben ist. Windows-Clients haben diese i.a. als V: verbunden, am RasPi hängt die unter /mnt/video1.


    b) Dann ist da noch ein (einer von mehreren) RasPi2 192.168.1.50 (LAN) / .51 (WLAN) mit ebenfalls Apache, PHP und MySql. Der läuft headless, kann aber in der Konfigurations-Phase über Dongle mit Maus und Tastatur versehen und an einem alten TFT angeschlossen werden.


    Auf dem Windows-Apache läuft ein Script, das die HDD nach bestimmten Files scannt und aus dem Dateinamen Meta-Informationen herausliest. Diese werden dann in einem Frameset dargestellt. Soweit so gut...


    Jetzt wollte ich diesen Job, wie einige andere auch, mal auf einen der RasPi umstellen, den ich direkt an die Fritz!Box hängen möchte. Die Platte kann (vorerst) auch gerne am Windows-Rechner bleiben. Vielleicht häng ich sie später auch direkt an den RasPi.


    Jetzt stellt sich aber das Problem, daß Umlaute in den Dateinamen, die vorher vom Windows-Server korrekt dargestellt wurden, am RasPi plötzlich murksig aussehen. Mit einem kleinen Test-Script habe ich das nachvollzogen. Am Windows-Rechner werden die Dateinamen mittels utf8_encode umgewandelt und daraufhin korrekt angezeigt. Laß ich das weg, erscheinen schwarze Rauten mit einem ? drin. Am RasPi aber genau umgekehrt: Mittels utf8_encode erhalte ich Murks-Zeichen (großes A mit Tilde drüber usw.), während die Dateinamen unverändert korrekt dargestellt werden. Und da frag ich mich doch so: Warum?


    index.php - Anpassung Windows / RasPi nur an Zeile mit "$directory = ..."


    Und falls noch jemand in die metatags.txt sehen möchte:


    Warum nicht einfach von beidem ableiten?^^


    Code
    class Button (object, ttk.Button):


    Dann sollte die "property"-Methode auch funktionieren, oder übersehe ich da was?^^


    Oh mein Gott... :wallbash:
    In dem ganzen Gewusel drumherum hab ich dieses Posting glatt übersehen.


    Und es war die einzig richtige Lösung für mein Problem bislang!


    Du hast da gar nichts übersehen. Das habe ich schon ganz alleine geschafft. :blush:


    Ich weiß jetzt nur eins nicht: Macht es einen Unterschied, in welcher Reihenfolge ich ableite? Ich hab mal vorsichtshalber erst ttk.Button, dann object als 2. Parameter dahinter.


    Auf alle Fälle funktioniert damit, nach erstem Test, der Setter für die Property!


    Gruß, Michael

    Ich würde auf jeden Fall eine Datenbank nehmen.


    Ich ebenfalls. Wenn man denn erstmal apache, php und mysql zum Laufen gebracht hat, wird man es nicht mehr missen möchten.


    Quote

    Zu Python und MySQL gibts jede Menge Infos im Web.


    Ich hab mal vor einiger Zeit hier im Beitrag #6 ein Mini-Python-Script gepostet, mit dem eine Tabelle angelegt, mit Daten gefüllt und wieder ausgelesen wird.


    Ansonsten ist das Schreiben in eine CSV-Datei die gleich dahinter 2.beste Wahl. Die läßt sich Anwender-freundlich mit Excel verarbeiten und kann später, wenn man denn doch auf eine Datenbank umschwenken möchte, problemlos dort importieren.


    Und die Kombination, an ggf. sogar mehreren Standorten jeweils, CSV-Dateien zu erzeugen, die dann als Tages-Abschluß gesammelt in die Datenbank gehen, ginge ja auch noch. Und man hat dann mit den CSV-Dateien auch quasi nebenbei ein Backup der Daten.


    Gruß, Michael

    Was du machst hast du zwar wortreich beschrieben - den kompletten, relevanten Code behältst du uns aber nach wie vor vor. Ergo: konkrete Fehlersuche nicht möglich, weil _wir_ nicht sehen, was du machst.


    Ach herrjeh... Es geht doch nicht darum, ob, was und wie ich in den Setter-/Getter-Routinen mache. Geh bitte nochmal zurück zum Eingangs-Posting und lies: Die Getter-/Setter-Methoden werden gleich gar nie nicht aufgerufen. Stell Dir einfach vor, ich hab nur ein 'print "xxx"' drin stehen und sehe nie eine Ausgabe auf der aufrufenden Konsole. Ich bekomme gleichzeitig aber auch keine Fehlermeldung des Hauptprogramms, daß es das Attribut nicht kennen würde. Also _irgendwas_ passiert da ja, nur eben nicht das Gewünschte.


    Quote
    Quote

    [...]dann kann `Foo` alles, was es können muss.


    ... außer Properties. ;)


    Eine exakte Kopie des Setter, nur mit dem anderen Namen "setImgFile", also ohne die beiden _ vorweg, macht ja genau das, was ich will, wenn ich sie denn direkt als public Methode vom Hauptprogramm aus aufrufe.



    Quote
    Quote


    Erschwert? Es ist lediglich ein bisschen mehr getippe, weil man mehr Prefixe braucht.


    Ja. Aber das ist keine Qualitäts-Aussage. Und das mit dem Schlüsselbund im Briefkasten schrieb ich ja schon.


    Nicht vorhandenes, "echtes" private ist kein Feature, sondern fehlende Funktionalität. Und die darauf jetzt wahrscheinlich kommende Antwort "braucht man ja auch nicht" (was, im Übrigen, sehr subjektiv ist): Bill Gates hat seinerzeit mal gesagt: "Mehr als 640 KB Arbeitsspeicher braucht kein Mensch in seinem PC.".



    Gruß, Michael

    Der von dir verlinkte Python-Kurs bezieht sich auf P3 - du nutzt aber nach eigenen Angaben P2.


    Ja, das war mir durchaus bewußt. Deswegen war ja einer meiner ersten Blicke auch, ob die "property" Geschichte womöglich erst mit P3 eingeführt wurde. Dann hätte ich "halbgar" mit public Setter und Getter weiter gemacht. Aber u.a. in dem von mir ja weiter oben schon verlinkten Stack Overflow Artikel stand ja eindeutig: Referenz auf "object" und es funktioniert mit P2.


    Quote

    Attribute und Methoden, die man als nicht öffentlich kennzeichnen möchte, bekommen nur einen führenden Unterstrich. Zwei führenden Unterstriche werden benutzt, wenn man Namenskollisionen mit Subklassen vermeiden möchte


    Ja, so hatte ich es irgendwo anders auch schon mal gelesen. Aber letztendlich paßt es trotzdem, auch wenn die Erklärung vielleicht nicht ganz korrekt ist: Nur 1 _ hindert niemanden daran, die Methode trotzdem aufzurufen, Konvention hin oder her. Das wäre so, als wenn ich mein Cabrio mit offenem Verdeck und offenen Türen auf das Parkdeck stelle, aber einen Zettel "bitte Autoradio drin lassen!" auf den Beifahrersitz lege. Bei 2 _ wird die Sache aber durch das mangling schon bedeutend erschwert. Das ist dann das, was für mich am nächsten an "private" herankommt.



    Quote

    Die richtige Verwendung von `property` - in den Regel nimmt man das als Decorater - wird auch in der offiziellen Python Doku zu P2.7 erklärt: Link. Da steht auch, wie man Attribute (richtig) read-only macht.


    Naja, die @property Syntax finde ich eher unübersichtlich. mit "x = property( ..." habe ich in einer Zeile die direkte Kontrolle über die Schnittstellen-Methoden und kann das auch im Source später einfacher lesen / nachvollziehen. Aber das mag Geschmackssache sein...



    Quote

    Und man kann auch über die Property steuern, dass Werte erst geprüft / verarbeitet / ... werden, bevor sie gesetzt werden.


    Ähm, ja? Und? Genau das mache ich doch jetzt. *verwirrt*


    [code=php]import math


    class Foo(object):[/php]


    Da ist es ja wieder, das böse "object". Mit "class Foo( ttk.Button ):" scheint es ja aber nicht mehr zu gehen. Und genau _das_ war ja meine ursprüngliche Frage... ;)


    Gruß, Michael

    [font="Verdana, sans-serif"]ich habe alles Mögliche probiert, aber leider ohne Erfolg.[/font]


    Das kommt mir bekannt vor...


    Ich hatte in einem anderen Thread hier[font="Verdana, sans-serif"] ein sehr ähnliches (wenn nicht sogar gleiches) Problem geschildert. Aber letztendlich, nach vielem Hin und Her, was soll ich sagen: Es funktioniert noch immer nicht.


    Also freue ich mich schon auf die Lösung, die dann hier zustande kommt. ;-)[/font]


    Gruß, Michael

    miriki: was hast du denn letztendlich vor? Getter und Setter sind in Python unüblich (und in der Regel überflüssig), weil es durch die Bank direkten Zugriff auf Attribut gibt. Warum hast du zwei Underscores vor dem Funktionsnamen?


    Deine zweite Frage ist recht gut hier beantwortet, bevor ich das selbst versuche, zusammenzufassen.


    Setter / Getter benutze ich prinzipiell gerne, vor allem sicherlich auch, weil ich diese Kapselung von anderen Sprachen her einfach gewohnt bin. Es ist aber auch die Kontrolle über die Werte, die ich gerne behalten will. So wird ein Setter gern mal den Werte-Bereich im Auge behalten. Außerdem sind ggf. nach dem Setzen eines Wertes unverzüglich weitere Aktionen notwendig. Eine andere Möglichkeit, auf Veränderung der Attribute zu reagieren, habe ich ja nicht, oder?


    Außerdem möchte ich ungern direkten Zugriff auf gespeicherte sensible Daten (z.B. Paßwort) zulassen - "write-only" nur per Setter ohne Getter. Und es macht auch keinen Sinn, den Temperatur-Wert eines Sensors zu setzen - da macht "read-only" über nur den Getter alleine Sinn. Ja, ich weiß... Auch mit __ läßt sich das alles nur mehr oder weniger stark verschleiern und letztendlich auch umgehen. Aber wenn ich mein Schlüsselbund in meinen Briefkasten werfe, tue ich das absichtlich und bin selbst schuld für die Folgen.


    Hier konkret in diesem Beispiel: mein von ttk.Button abgeleiteter mrk.Button bekommt das neue Attribut "imgfile", in dem ein Dateiname zu einem Bild gespeichert wird. Wenn jetzt ein Dateiname gesetzt wird, dann überprüft der Setter ggf., ob die Datei existiert, ein gültiges Bild ist usw. und setzt ansonsten "None" als Wert, bevor mir nachgeschaltete Routinen unkontrolliert gegen die Wand fahren. (Ja, eine Warnung gebe ich vielleicht zusätzlich auch noch aus...)


    Die könnten natürlich auch alle jeweils jedesmal auf die Existenz / Gültigkeit der Datei prüfen, aber wenn dies in einer Timer-Loop jede Sekunde passiert, killt das die Performance ohne Ende. Da teste ich doch lieber schnell mal auf imgfile != None und verlaß mich ansonsten darauf, daß eine vorgeschaltete Routine (eben dieser Setter) einmal überprüft hat, daß es ein Bild ist, daß ich verarbeiten kann.


    Und wenn ein neuer Dateiname gesetzt wird, dann soll das Bild auch sofort aktualisiert werden, und nicht erst, wenn das nächste Event (Timer, Interrupt, wasauchimmer...) eintritt.



    Aus Performance-Gründen speichere ich das geladene Bild auch intern. Das Bild soll nämlich dynamisch an die Größe des Buttons angepaßt werden. Da will ich aber nicht bei jeder Größenänderung das Bild (von Platte, Netz, Staffelei ;) ...) neu laden.


    Deswegen habe ich
    - property imgfile --> Setter/Getter für self.__imgfile
    - self.__imgfile --> Dateiname
    - self.__bitmap --> Image.open( self.__imgfile )
    - self.__image --> ImageTk.PhotoImage( self.__bitmap )
    - self.onConfigure() --> setzt self['image'] = self.__image nach Anpassung


    Gruß, Michael

    Wenn ich nach "python2 property python3" google gibts einige Themen dazu


    Naja, wenn ich mir den 1. Treffer auf Stack Overflow dazu ansehe (was ich schon vor Erstellen meiner Frage hier übrigens getan habe, den kannte ich also u.a. schon), dann steht dort das, was ich schrieb:


    Der OP fragt nach Problemen mit "class A:", "class B:" und "property" und bekommt den Hinweis, daß er "new-style classes" in Python 2.x benutzen muß, die von "object" abgeleitet sind. Ich will aber nicht von "object", sondern von "ttk.Button" ableiten.


    Und ich will auch nicht unbedingt auf Python 3.x umstellen, weil ich mir damit wahrscheinlich nur noch mehr Probleme neu schaffe. Es sei denn, die Aussage ist definitiv, daß ein Ableiten von ttk.Button mit Benutzung von property _nicht_ _möglich_ ist, dann überleg ich mir das noch mal.


    Gruß, Michael

    Moinsens!


    Ich krieg hier ein Problem mit "property" nicht gelöst und verwende deswegen als Notlösung eine public "Setter" Routine. Ich möchte es aber schon gerne mal als "echte" property zum Laufen kriegen.


    Was ich habe:

    Code
    class Button( ttk.Button ):
    [...]
    def __getImgFile( self ):
    [...]
    def __setImgFile( self, v ):
    [...]
    imgfile = property( __getImgFile, __setImgFile )


    Nun stieß ich beim Suchen nach dem Problem auf den Hinweis mit "old-style" und der Notwendigkeit, Klassen von "object" abzuleiten, damit "property" überhaupt funktioniert. Das scheint mir aber, soweit ich das verstanden habe, darauf gemünzt zu sein, daß früher Klassen gerne als


    Code
    class Button:


    deklariert wurden, also ganz ohne Referenz. Ich will ja aber explizit von ttk.Button ableiten. Da wäre es doch wohl kontraproduktion, stattdessen von object abzuleiten, oder?


    Nichtsdestotrotz: Die properties haben keine Wirkung. Weder Getter noch Setter werden überhaupt durchlaufen. Eine Debug-Ausgabe in den Routinen erfolgt nicht, das Hauptprogramm meldet aber auch keinen Fehler.


    Was muß ich noch beachten / ändern?


    Gruß, Michael