Alarmlog mit Zeitstempel und Prio. 1&2

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Hallo zusammen

Dies ist mein erster Eintrag in diesem Forum :D
Ich habe den Auftrag in unserer Firma erhalten, die Lüftungs- und Heizungsalarme und -meldungen mit Zeitstempel auf einem Display anzuzeigen und je nach Priorität anders zu behandeln. Der Alarm sollte so lange angezeigt werden, bis die komplette Liste mit einem Taster (oder Button auf der GUI) gelöscht wird.
Da zum einbauen der "Logik" nicht viel Platz vorhanden ist, möchte ich das mit einem Rasperry Zero erledigen. Da aber auf einem einzelnen Raspberry zu wenige Eingänge sind möchte ich dann mehrere Raspberrys zusammen kommunizieren lassen. Die GUI für die Anzeige der Alarme möchte ich mit Tkinter machen.
Nun meine Fragen: Wie würdet Ihr das machen? Gibt es auf Tkinter oder Python ein Tool, dass neue Meldungen immer unten an eine Liste anfügt? Oder wie kann man das programmieren?

Liebe Grüsse
Lacsap
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich wuerde das ueberhaupt nicht mit einem PI machen. Sondern einem ESP32, gerne auch in micropython. Der ist ausreichend leistungsstark, kleiner, verbraucht weniger Strom, und ist vor allem VIEL VIEL VIEL robuster. Strom dran, laeuft. Den/die PIs musst du ueberhaupt erstmal fit machen fuer einen solchen Einsatz. SD-Karte schuetzen, indem nur minimal geschrieben wird, auto-start, etc.

Und ich teile auch deine Einschaetzung, dass du mehrere PIs benutzen musst, nicht. Es gibt Bausteine die IO-Expansion betreiben, wenn du mehr IO brauchst. Die wuerde ich in jedem Fall benutzen, unabhaengig von der verwendeten uC-Hardware.

Last but not least: fuer einen solchen Einsatz wuerde ich einen erfahrenen Elektroniker zu Rate ziehen, was den Aufbau der Schaltung angeht. Galvanische Trennung der Leitungen, etc.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und als Display wuerde ich sowas hier ins Auge fassen: https://www.google.com/search?q=nextion ... e&ie=UTF-8 - das macht die Programmierung DEUTLICH einfacher.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Lacsap93: woher kommen denn die Alarme? Über welches Protokoll?
Welches Wissen hast Du über das System? Welches Budget?
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Hallo zusammen
@__deets__
Danke für die schnelle Antwort!
Ich werde dein Vorschlag mit einem ESP32 überprüfen und mich darüber schlau machen. Ich hatte Rasperry gewählt, weil ich es ein wenig kenne.
Bei dieser Anlage benötige ich etwa 120 Eingänge und vielleicht 5 Ausgänge. Kann man denn das so viel erweitern?
Ich bin selber Elektriker daher kenne ich mich ein wenig aus. Aber trotzdem danke für den Hinweis :-)
Nextion-Displays kannte ich noch nicht. Das sieht sehr interessant aus. Auch darüber werde ich mich schlau machen.

@ Sirius
Danke auch für deine Antwort!
Die Alarme kommen alle einzeln per 24V Spannung an, z.B. über einen Potentialfreien Störungskontakt einer Pumpe. Also ohne Bus oder so etwas.
Also wenn du das Heizungs-und Lüftungssystem meinst, das kenne ich gut oder sogar sehr gut.
Das Budget ist leider ziemlich klein. So etwa um 300-400 Euro. Da nichts gemacht werden muss, es aber praktisch wäre wenn das so funktioniert. Deshalb suche ich auch nach günstigen Lösungen.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

24V kann man nicht direkt an diese Microcontroller anschließen. Dazu brauchst Du also eh eine Erweiterungskarte. Die haben dann üblicherweise 8 oder 16 Kanäle und werden per I2C angesprochen. Du mußt also mindestens 8 dieser Karten anschließen, was an einem I2C-Bus schon sportlich wird.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Ich hätte das über Relais oder Optokoppler gelöst, so dass ich eine saubere Trennung habe. Dies kann ich auch selber zusammenbauen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

120 Eingaenge sind schon nen Brett. Es kommt ein bisschen darauf an, wie die sich verhalten. Bleiben die HIGH wenn sie einmal gemeldet haben? Oder sind das nur kurze Flankenwechsel. Wenn ersteres, dann reicht eine simple Kaskade von seriellen Shift-Registern. Damit liest du via SPI einfach einen 120 Bit langen Bitstring ein, und pruefst die dann nacheinander ab. Wenn letzteres, dann muss man schon sehen, dass man da einen Interrupt-Faehigken IO-Expander verwendet. Da kann man zB den hier https://www.microchip.com/wwwproducts/en/MCP23S17 nehmen, auch in der SPI-Variante. SPI kann man ggf. daisy-chainen oder du benutzt verschiedene Chip-Selects. Ggf.kaskadiert wiederum mit den weiteren IO-Expandern. Da wuerde ich ggf. auch schauen, ob es etwas fertiges gibt.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Ok das waren mir ein bisschen zu viele Fachausdrücke.
Mal um auf die Frage zu antworten: die kürzesten Fehlermeldungen stehen etwa 3-5 Sekunden an. Die meisten aber länger. Würden 3 Sekunden reichen um den 120Bit langen String auszulesen?
Noch etwas anderes: Kann man die Nextion-Displays auch testen, ohne das man so ein Display besitzt? Also irgend ein Programm wo man das testen könnte was auf dem Display angezeigt wird? Vielleicht sogar im Programm von Nextion selber?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Drei Sekunden reichen sicherlich locker aus, um diesen 120 Bit String einzulesen. Bei 120 Bit sind das ~8 von zB sowas hier: https://www.ti.com/lit/ds/sdls195/sdls195.pdf

Ob das Nextion getestet werden kann, weiss ich nicht. Ein Kumpel arbeitet damit & ich bin von den Ergebnissen beeindruckt, und es eignet sich besser als eine GUI selber zu stricken IMHO.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Hallo
Ich habe mich nun ein bisschen schlau gemacht. Laut einem Tutorial Video kann man im Nextion Editor auch gleich das Display testen, auch wenn man noch keines hat (habe ich aber selber noch nicht ausprobiert)!
@__deets__ Die 16 Bit Schieberegister sind viel teurer als die 8Bit und deshalb würde ich 15 8Bit Eingangs-Register hintereinander schalten. Das sollte ja auch gehen oder? Es wird mehr Platz in Anspruch nehmen aber sonst macht das ja keinen Unterschied. Mit Schieberegister kenne ich mich nicht aus. Daher die Frage: würde ein solches denn gehen: 74HC166N. In den Datenblättern sind verschiedene Spannungen angegeben. Nun bin ich nicht ganz sicher wie hoch die Spannung der Versorgung und die der parallelen Eingänge sein sollte. Kannst du mir da weiterhelfen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Register ist nicht geeignet, weil es ein AUSGABE Register ist. Du brauchst eine Eingabe. Es gibt sicherlich ein äquavilentes Eingaberegister. Was du allerdings mit verschiedenen Spannungen meinst, verstehe ich nicht.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Danke für die schnelle Antwort. Dies sollte (glaube ich) das richtige Register sein oder? SN74HC165N
Mit Spannungen meine ich, die Spannung, die das Bauteil benötigt um zu funktionieren(Versorgungsspannung) und den Spannungswert, ab dem ein Eingang als "High" und nicht mehr als "Low" erkannt wird.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das der Baustein toleranter ist beim erkennen von High und Low ist ein Feature. Spannungen können durch zb Leitungslänge abfallen, und man will das ja trotzdem zuverlässig als HIGH erkennen. Das ist für alle TTL Bausteine so. Und ja, das sieht ok aus.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Nun habe ich mir ein paar Schieberegister und ein Nextion-Display gekauft und habe mit beidem verschiedenes getestet.
Weiss jemand wie ich nun am einfachsten die Alarmauflistung machen kann? Also kann man irgendwie in Python eine Liste erstellen, bei der die neuen Alarme sich hinten "anstellen" und die man dann mit einem Button löschen kann? Ginge das mit einer ganz normalen Liste in diesem Stil:?

Code: Alles auswählen

Alarmmeldungen[Alarm1, Alarm2, Alarm3, Alarm4]
Wenn ja wie? Und wie wie kann ich das am Besten auf das Display übertragen?

LG Lacsap
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Display scheint man ja über die Serielle Schnittstelle anzusprechen. Mußt Du halt in der Dokumentation nachlesen, wie genau.
Und ja, Listen sind dazu da, dass man etwas anhängt, oder dass man sie leeren kann.
Was Du genau machen willst mußt DU programmieren. Also als erstes Dir die Grundlagen von Python aneignen.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Danke Sirius für die Antwort.
Ich wusste nur nicht ob es vielleicht noch eine bessere Lösung als Listen gibt.
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Hallo Leute
Ich benötige noch einmal eure Hilfe bei einem Problem in meinem Projekt:
Folgender Code schreibt beim Aufrufen von A0 "Störung Heizung" in das Textfeld t1 auf dem Nextion:

Code: Alles auswählen

A0=b"t1.txt=\"Störung Heizung\""
Kann mir jemand sagen, wie ich Teile davon ändern kann? Ich hatte schon verschiedenes versucht, aber leider geht es nicht. Am Liebsten würde ich den Text "Störung Heizung" anpassen. Aber wenn ich hier eine Variable als Platzhalter für einen Text einfüge gibt es mir auch logischerweise die Variabelbezeichnung aus und nicht der in der Variable gespeicherten Text. Gibt es da irgendein Trick oder etwas, das mir helfen könnte?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie sieht denn der komplette Code dazu aus? Wo wird dieses `A0` denn verwendet?
Lacsap93
User
Beiträge: 23
Registriert: Mittwoch 20. November 2019, 08:50

Ich habe nur die betreffende Klasse angefügt, denn das Programm ist sehr gross. Auf Wunsch kann ich schon gerne das gesamte Programm anfügen.

Code: Alles auswählen

    class Test(ReadHandler):

        
        A1=b"t1.txt=\"Stoerung Grundwasserpumpe 1\""
        A2=b"t2.txt=\"Stoerung Grundwasserpumpe 2\""
        A0=b"t0.txt=\"Störung Heizung\"" 
        
        anweisung=[]

            
        print (len(anweisung))
        
        def __init__(self, serial_out, load_pin, clock_enable, clock_pin, warnings=False, bitcount=16):
            ReadHandler.__init__(self, serial_out, load_pin, clock_enable, clock_pin, warnings, bitcount)
        
        def handle_on_up(self, pin):
            print('Pin {} has been changed to UP'.format(pin))
            print(pin)
            print ("Länge der Liste:{}" .format(len(self.anweisung)))
            if (pin) ==5:
                self.anweisung+=[self.A0]
                befehl=self.fuenf()
                print("y")
            if (pin) ==9:
                self.anweisung+=[self.A1]
                befehl=self.neun()
                print("y")
            if (pin) ==10:
                self.anweisung+=[self.A2]
                befehl=self.zehn()
                
        def fuenf(self):
            print('n1')

            if self.A0 in self.anweisung:
                port.write(self.A0)
                port.write(k)
                port.write(k)
                port.write(k)
                print('run')        
        
        def neun(self):
            print('n1')

            if self.A1 in self.anweisung:
                port.write(self.A1)
                port.write(k)
                port.write(k)
                port.write(k)
                print('run')

        def zehn(self):
            print('n1')
            port.write
            if self.A2 in self.anweisung:
                port.write(self.A2)
                port.write(k)
                port.write(k)
                port.write(k)
                print('run')

        def handle_on_down(self, pin):
            print('Pin {} has been changed to DOWN'.format(pin))
            
    

    with Test(26, 4, 6, 5) as t:
        try:
            t.watch_inputs() 
        except KeyboardInterrupt:
            t.loop_breaker = True
            print('\nBroke Loop')
Mir ist bewusst, dass die Liste so noch nicht viel Sinn ergibt. Aber ich brauche sie dann für einen weiteren Schritt. Ich möchte dann über die Länge der Liste in Erfahrung bringen, wie viele Einträge gespeichert sind und über eine if-Anweisung die Texte zuweisen.
Antworten