Ankündigung

Einklappen
Keine Ankündigung bisher.

Arduino Mosbus RTU openHAB

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Arduino Mosbus RTU openHAB

    Hab seit längerer Zeit nach einer Möglichkeit gesucht wie man Arduino was an den Raspberry mittels USB Kabel angeschlossen ist, übers Web steuern kann. Hab viele Apps gesehen aber alles nicht das wahre....
    Nun hab ich openHAB gefunden und bin begeistert davon weils auf allen Systemen läuft.
    Anfangs hatte ich Start Schwierigkeiten bei der Version 1.5 für MAC 1.9 aber hier hab ich dann ne Lösung gefunden.

    Ich hab ein Arduino UNO als Master und Atmega8 als Slaves's.
    Slaves sind mit dem Master über MAX485 verbunden.
    Momentan hab ich die RS485 Lib von Nick Gammon, funktioniert soweit auch.
    Nun möcht ich das ganze mit openHAB steuern, die Modbus RTU libraries for Arduino habe ich bereits auf Master und Slave ausprobiert, PWM für LED9 funktioniert.
    openHAB hat das Modbus TCP binding aber nicht das RTU, soweit ich weiß.

    Hab Evaluations-Platine für Heimautomatisierung - Mikrocontroller.net auch gesehen, Sketch ausprobiert und es läuft. Da hab ich nur die Verbindung zu dem Master und nicht den Slaves.

    Kann mir jemand Tipps und Tricks zeigen, wie man das System mit openHAB realisieren kann?
    Souliss habe ich mir angeschaut, ist wohl auch nur für TCP.

    #2
    Okay, das Modbus Binding ist wohl für TCP und RTU.
    Hab in openhab.cfg dies stehen:
    Code:
     modbus:poll=100
     modbus:serial.slave1.connection=/dev/tty.usbmodem1a1241:9600
     modbus:serial.slave1.id=1
     modbus:serial.slave1.start=0
     modbus:serial.slave1.length=8
     modbus:serial.slave1.type=coil
    in items hab ich dies:
    Code:
    Group All
    Group gGF (All)
    Group GF_KU  "Küche"         <kitchen>       (gGF)
    
    Switch Contact3 "Contact3" (All)   {modbus="slave1:2"}
    Switch Switch23 "Switch23" (All)   {modbus="slave1:22"}
    Wie muss die Modbus Binding richtig installiert werden, reicht es wenns in den addons Ordner liegt?
    Was muss in den rules sein?

    Würde mich über ein Beispiel für ein Switch freuen.

    Modbus Wird wohl geladen laut Debug:

    23:57:59.071 DEBUG o.o.b.m.i.ModbusActivator[:30] - Modbus binding has been started.
    23:57:59.072 DEBUG o.o.m.i.i.GenericItemProvider[:334] - Start processing binding configuration of Item 'Contact3 (Type=SwitchItem, State=Uninitialized)' with 'ModbusGenericBindingProvider' reader.
    23:57:59.072 DEBUG o.o.m.i.i.GenericItemProvider[:334] - Start processing binding configuration of Item 'Switch23 (Type=SwitchItem, State=Uninitialized)' with 'ModbusGenericBindingProvider' reader.

    Kommentar


      #3
      Kann mir jemand bei der Verbindung zum Arduino helfen?
      Ich bekomme nur diese Ausgabe:
      Code:
      03:29:42.617 INFO  o.o.b.m.internal.ModbusSlave[:285] - ModbusSlave error getting responce from slave
      Last request: 01 03 00 00 00 08 44 0c
      Error reading response
      execute try 1 error: I/O exception - failed to read
      Last request: 01 03 00 00 00 08 44 0c
      Error reading response
      execute try 2 error: I/O exception - failed to read
      Last request: 01 03 00 00 00 08 44 0c
      Error reading response
      Hab es mit dieser Lib versucht
      https://code.google.com/p/simple-mod...8.zip&can=2&q=

      Kommentar


        #4
        Mal generell ne Frage zu openHAB...
        Ist es als Slave oder als Master?
        Wenns als Master ist, darf der Arduino (der mit dem Raspberry per USB angeschlossen ist) dann nicht den Master Sketch drauf haben?

        Welche ID vergebe ich denn hier? Die von openHAB? Dann ist ja openHAB als Slave.
        Code:
        modbus:serial.slave1.id=1

        Kommentar


          #5
          Hallo skorpi08,

          hast du das mit dem Modbus RTU in der Zwischenzeit hinbekommen und wenn ja, wie?

          Ich habe auch ein Gerät das ich über Modbus RTU/RS485 ansteuern möchte.
          Kann ich dies mit Hilfe eines RS232/RS485 oder USB/RS485 Konverter der an meinem Raspberry PI angeschlossen ist und dem Modbus TCP Binding realisieren?

          Über jegliche Hilfe wäre ich dankbar!

          Gruß
          mepi0011

          Kommentar


            #6
            Hallo,

            in der Zwischenzeit bin ich etwas weitergekommen.

            Das Gerät das ich über RS485 ansteuern möchte, gibt mir an der Adresse 8192 den Wert 0x14ef zurück. Zumindest über das Programm modpoll!

            Code:
            modpoll.3.4$ ./modpoll -a 247 -b 19200 -r 8192 -0 -t4:hex /dev/ttyUSB0
            
            
            modpoll 3.4 - FieldTalk(tm) Modbus(R) Master Simulator
            Copyright (c) 2002-2013 proconX Pty Ltd
            Visit http://www.modbusdriver.com for Modbus libraries and tools.
            
            Protocol configuration: Modbus RTU
            Slave configuration...: address = 247, start reference = 8192 (PDU), count = 1
            Communication.........: /dev/ttyUSB0, 19200, 8, 1, even, t/o 1.00 s, poll rate 1000 ms
            Data type.............: 16-bit register (hex), output (holding) register table
            
            -- Polling slave... (Ctrl-C to stop)
            [8192]: 0x14EF
            -- Polling slave... (Ctrl-C to stop)
            [8192]: 0x14EF
            OpenHAB gibt mit leider eine Fehlermeldung zurück!

            Die openhab.cfg sieht wie folgt aus:

            Code:
            modbus:poll=1000
            modbus:serial.slave1.connection=/dev/ttyUSB0:19200:8:"even":1
            modbus:serial.slave1.type=input
            modbus:serial.slave1.id=247
            modbus:serial.slave1.start=8192
            modbus:serial.slave1.length=1
            Das Item:

            Code:
            Number HeaterManufacturerID "EGO Smart Heater Hersteller iD [%d]" (SmartHeater) {modbus="slave1:0"}
            Die openHAB Ausgabe auf der Konsole:

            Code:
            ./start.sh
            
            Launching the openHAB runtime...
            osgi> 2015-03-29 18:15:38.725 [INFO ] [.o.core.internal.CoreActivator] - openHAB runtime has been started (v1.6.2).
            2015-03-29 18:15:39.551 [INFO ] [o.o.i.s.i.DiscoveryServiceImpl] - mDNS service has been started
            2015-03-29 18:15:39.582 [INFO ] [o.o.i.s.i.DiscoveryServiceImpl] - Service Discovery initialization completed.
            2015-03-29 18:15:41.282 [INFO ] [penhab.io.rest.RESTApplication] - Started REST API at /rest
            2015-03-29 18:15:49.226 [INFO ] [c.internal.ModelRepositoryImpl] - Loading model 'test.sitemap'
            2015-03-29 18:15:49.337 [INFO ] [c.internal.ModelRepositoryImpl] - Loading model 'test.items'
            2015-03-29 18:15:50.200 [INFO ] [.o.u.w.i.servlet.WebAppServlet] - Started Classic UI at /openhab.app
            2015-03-29 18:15:53.308 [INFO ] [.service.AbstractActiveService] - Modbus Polling Service has been started
            Last request: f7 04 20 00 00 01 2e 9c
            Error reading response
            execute try 1 error: I/O exception - failed to read
            Last request: f7 04 20 00 00 01 2e 9c
            Error reading response
            execute try 2 error: I/O exception - failed to read
            Last request: f7 04 20 00 00 01 2e 9c
            Error reading response
            2015-03-29 18:15:54.840 [INFO ] [.b.modbus.internal.ModbusSlave] - ModbusSlave error getting responce from slave
            Ideen woran dies liegt?

            Kann ich in der openhab.cfg auch einstellen, dass ich Modbus RTU verwende?

            Über jegliche Hilfe bin ich dankbar!

            Gruß
            mepi0011

            Kommentar


              #7
              Hallo,

              in der Zwischenzeit habe ich mein Problem mit Hilfe des folgenden Links gelöst:

              https://github.com/openhab/openhab/i...mment-76625450

              In der Datei openhab.cfg die connection des Slave wie folgt anpassen:

              Code:
              modbus:serial.slave2.connection=/dev/ttyUSB0:19200:8:even:1:rtu
              danach wird der Wert korrekt ausgelesen.

              Folglich stimmt die Erklärung der openHAB Wiki Seite nicht mehr mit dem Funktionsumfang des Bindings überein. Ich würde dies gerne anpassen, leider kenne ich den kompletten Funktionsumfang des modbus Binding nicht. Wenn mir jemand dies zukommen lässt, würde ich die Wiki Seite aktualisieren!

              Gruß
              mepi0011

              Kommentar


                #8
                Ich bin gerade dran ein dediziertes Openhab Binding für den Ego Smart Heater zu schreiben. Am Besten hier auch mal reinschauen.
                http://www.photovoltaikforum.com/son...r-t106123.html

                Kommentar


                  #9
                  Moin mepi, der Tipp mit den Parameter war Gold wert
                  War schon kurz vorm aufgeben.

                  Stehe nun vor einem Problem, hab seit einigen Tagen schon im Web gesucht aber nix verständliches gefunden.
                  Und zwar, verstehe ich die Adressierung nicht.
                  Waruim fängt es hier erst bei 16 an?---> modbus:serial.slave2.start=16
                  Kann man es irgendwie ausrechnen, gibt es Tabellen etc woman es abschauen muss?
                  Oder muss man mit nem Programm durchpollen?

                  Und noch was, wie kann man das aktuelle Modbus Binding so ändern, dass nur dann im Log ausgegeben wird, wenn sich zB der Button getätigt wurde?

                  Code:
                  ############################### Modbus Binding ########################################
                  #
                  # sets refresh interval to Modbus polling service. 
                  # Value in milliseconds (optional, defaults to 200)
                  modbus:poll=1000
                  
                  modbus:serial.slave1.connection=/dev/ttyUSB0:19200:8:none:1:rtu
                  modbus:serial.slave1.id=1
                  modbus:serial.slave1.start=0
                  modbus:serial.slave1.length=4
                  modbus:serial.slave1.type=discrete
                  
                  modbus:serial.slave2.connection=/dev/ttyUSB0:19200:8:none:1:rtu
                  modbus:serial.slave2.id=1
                  modbus:serial.slave2.start=16
                  modbus:serial.slave2.length=4
                  modbus:serial.slave2.type=coil
                  Code:
                  sitemap demo label="Main Menu"
                  {
                  
                      Frame {
                          Group item=FF_Modbus icon="attic"
                      }
                  
                      Frame {
                          Text item= MB_DT0
                          Text item= MB_DT1
                          Text item= MB_DT2
                          Text item= MB_BTN
                          Switch item= MB_CL16
                          Switch item= MB_CL17
                          Switch item= MB_CL18
                          Switch item= MB_LED
                      }
                  
                  }
                  Code:
                  Group    FF_Modbus     "Modbus"     (All)
                  Contact MB_DT0        "DT0 [MAP(en.map):%s]"    (FF_Modbus){modbus="slave1:0"}
                  Contact MB_DT1        "DT1 [MAP(en.map):%s]"    (FF_Modbus){modbus="slave1:1"}
                  Contact MB_DT2        "DT2 [MAP(en.map):%s]"    (FF_Modbus){modbus="slave1:2"}
                  Contact MB_BTN        "BTN [MAP(en.map):%s]"    (FF_Modbus){modbus="slave1:3"}
                  Switch  MB_CL16        "CL16"             (FF_Modbus){modbus="slave2:0"}
                  Switch  MB_CL17        "CL17"             (FF_Modbus){modbus="slave2:1"}
                  Switch  MB_CL18        "CL18"             (FF_Modbus){modbus="slave2:2"}
                  Switch  MB_LED          "LED"             (FF_Modbus){modbus="slave2:3"}
                  https://github.com/smarmengol/Modbus...ve-for-Arduino

                  Arduino Sketch:
                  Code:
                  #include "ModbusRtu.h"
                  
                  #define ID   1      // адрес ведомого
                  #define btnPin  7   // номер входа, подключенный к кнопке
                  #define ledPin  13  // номер выхода светодиода
                  
                  //Задаём ведомому адрес, последовательный порт, выход управления TX
                  Modbus slave(ID, 1, 2); 
                  boolean led;
                  
                  // массив данных modbus
                  uint16_t au16data[2];
                  
                  void setup() {
                    // настраиваем входы и выходы
                    io_setup();
                    // настраиваем последовательный порт ведомого
                    slave.begin( 19200 ); 
                      // initialize both serial ports:
                    Serial.begin(19200);
                  }
                  
                  void io_setup() {
                    digitalWrite(ledPin, LOW ); 
                    pinMode(ledPin, OUTPUT);   
                    pinMode(btnPin, INPUT);  
                  }
                  
                  void loop() {
                    // обработка сообщений
                    slave.poll( au16data, 2);  
                    io_poll();
                     // read from port 1, send to port 0:
                      Serial.println(au16data[0]);
                    }
                   
                  
                  void io_poll() {
                    //Копируем Coil[1] в Discrete[0]
                    au16data[0] = au16data[1];
                    //Выводим значение регистра 1.3 на светодиод 
                    digitalWrite( ledPin, bitRead( au16data[1], 3 ));
                    //Сохраняем состояние кнопки в регистр 0.3
                    bitWrite( au16data[0], 3, digitalRead( btnPin ));
                  
                  
                  }

                  Kommentar


                    #10
                    löschen
                    Zuletzt geändert von skorpi08; 23.08.2015, 00:30.

                    Kommentar


                      #11
                      Keiner der es weiß und mir helfen will?

                      Kommentar


                        #12
                        Hallo skorpi08,
                        zu
                        Und noch was, wie kann man das aktuelle Modbus Binding so ändern, dass nur dann im Log ausgegeben wird, wenn sich zB der Button getätigt wurde?
                        man kann. Man muss den Code ändern und ihn dann selbst kompilieren, geändert hat das hier schon jemand: https://github.com/openhab/openhab/pull/2939 allerdings weigert man sich noch es in openhab offiziell hineinzunehmen.
                        Habe das Problem auch. Ist nicht nur unschön sondern auf dem Raspberry PI ein heftiges Performanceproblem. Bei mir sind es rund 400 Item Updates pro Sekunde. Das schafft der nicht.

                        Zu
                        Waruim fängt es hier erst bei 16 an?---> modbus:serial.slave2.start=16
                        Das ist schlicht und einfach die interne Adressierung des Modbus-Clients. Bei dem Beispiel will man halt 4 Ausgänge beginnend ab Ausgang Nr. 16 auslesen.

                        MV

                        Kommentar

                        Lädt...
                        X