Seite 1 von 2

Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Mittwoch 20. November 2019, 11:00
von Lacsap93
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

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Mittwoch 20. November 2019, 11:16
von __deets__
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.

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Mittwoch 20. November 2019, 11:18
von __deets__
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.

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Mittwoch 20. November 2019, 11:47
von Sirius3
@Lacsap93: woher kommen denn die Alarme? Über welches Protokoll?
Welches Wissen hast Du über das System? Welches Budget?

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Mittwoch 20. November 2019, 13:21
von Lacsap93
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.

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Mittwoch 20. November 2019, 14:09
von Sirius3
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.

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Mittwoch 20. November 2019, 14:18
von Lacsap93
Ich hätte das über Relais oder Optokoppler gelöst, so dass ich eine saubere Trennung habe. Dies kann ich auch selber zusammenbauen.

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Mittwoch 20. November 2019, 15:00
von __deets__
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.

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Mittwoch 20. November 2019, 15:31
von Lacsap93
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?

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Mittwoch 20. November 2019, 15:37
von __deets__
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.

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Freitag 22. November 2019, 09:30
von Lacsap93
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?

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Freitag 22. November 2019, 10:02
von __deets__
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.

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Freitag 22. November 2019, 10:21
von Lacsap93
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.

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Freitag 22. November 2019, 10:42
von __deets__
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.

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Mittwoch 18. Dezember 2019, 13:14
von Lacsap93
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

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Mittwoch 18. Dezember 2019, 13:52
von Sirius3
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.

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Mittwoch 18. Dezember 2019, 14:23
von Lacsap93
Danke Sirius für die Antwort.
Ich wusste nur nicht ob es vielleicht noch eine bessere Lösung als Listen gibt.

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Montag 6. Januar 2020, 15:03
von Lacsap93
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?

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Montag 6. Januar 2020, 15:09
von Sirius3
Wie sieht denn der komplette Code dazu aus? Wo wird dieses `A0` denn verwendet?

Re: Alarmlog mit Zeitstempel und Prio. 1&2

Verfasst: Montag 6. Januar 2020, 15:29
von Lacsap93
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.