Ankündigung

Einklappen
Keine Ankündigung bisher.

RFLINK über MQTT Auswerten

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

    RFLINK über MQTT Auswerten

    Servus Leute, ich brauche wieder einmal eure Hilfe... Zu meinen Anliegen... Ich habe einen RFLink an einen Raspberry welcher die Daten per mqtt weiterleitet. Da das Openhab2 Addon für RFLink noch unbrauchbar ist. Ich veruche die Daten vom Revolt EnergyMeter zu verarbeiten im RFXCOM Manager sieht der eingang so aus

    Code:
    Packettype    = POWER
    subtype       = ELEC5 - Revolt
    Sequence nbr  = 2
    ID            = 2B4D decimal:11085
    Voltage       = 225 Volt
    Current       = 2,69 Ampere
    Instant power = 196,4 Watt
    total usage   = 4,36 kWh
    power factor  = 0,78
    Frequency     = 50
    Signal level  = 8  -56dBm
    was natürlich am besten wäre aber im Openhab2 RFXCOM Addon bekomm ich dies nicht angezeigt.

    eingang in Openhab mit RFLINK

    Code:
    20;76;Revolt;ID=2b4d;VOLT=08de;CURRENT=001b;WATT=07d4;FREQ=32;PF=4d;ENERGY=002f;
    jetzt habe ich versucht die Daten mit einer Rule zu verarbeiten was so aussieht



    meine Items

    Code:
    String rfLinkRx "rfRx: [%s]" {mqtt="<[mosquitto:rflink/rx:state:default]"}
    String rfLinkTx "[%s]" {mqtt=">[mosquitto:rflink/tx:command:*:default]"}
    String rfLinkid
    String rfLinkvo
    String rfLinkcu
    String rfLinksw
    String rfLinkcmd
    Code:
    rule "RFLINK_AUSWERTUNG"  
     when  
        Item rfLinkRx received update
     then  
          var String rfLinkRxUpdate = rfLinkRx.state.toString.trim  
    
          var int idStartsOn = rfLinkRxUpdate.indexOf("ID=") + "ID=".length  
          var String reading44444 = rfLinkRxUpdate.mid(idStartsOn, rfLinkRxUpdate.indexOf(';')-idStartsOn)  
    
          var int VOLTStartsOn = rfLinkRxUpdate.indexOf("VOLT=") + "VOLT=".length  
          var String reading55555 = rfLinkRxUpdate.mid(VOLTStartsOn, rfLinkRxUpdate.indexOf(';')-VOLTStartsOn)
    
          var int cuStartsOn = rfLinkRxUpdate.indexOf("CURRENT=") + "CURRENT=".length  
          var String reading66666 = rfLinkRxUpdate.mid(cuStartsOn, rfLinkRxUpdate.indexOf(';')-cuStartsOn)
    
          rfLinkid.postUpdate(reading44444)
          rfLinkvo.postUpdate(reading55555)
          rfLinkcu.postUpdate(reading66666)
    end
    doch leider kommt nichts an... und dann noch das Problem das die werte ja umgerechnet werden müssen...

    habt ihr eine Idee??
    Zuletzt geändert von icedeath82; 06.01.2017, 15:06.

    #2
    keiner eine Idee?

    Kommentar


      #3
      Ich sach ma so... kleine Schritte gehen...
      Als erstes könntest Du logInfo-Zeilen in die Rule einbauen, um zu sehen, was passiert.:
      Code:
      logInfo("rflink","Ursprungsstring= {}",rfLinkRx.state)
      gleich als erste Zeile im then-Block der Rule.
      Immer wenn Du irgendwelche Teilstrings extrahierst, baust Du entsprechende Zeilen im Anschluss ein, um zu sehen, was Du berechnet hast.

      Die Frage ist ja zuerst, ob rfLinkRx überhaupt ein Update erhält (dann müsste zumindest das erste logInfo den Inhalt ausspucken)

      Kommentar


        #4
        OK super danke ich bin nun schon Mal soweit das ich die Hex Werte angezeigt bekomme also ich habe als Watt Anzeige nun
        07d4 Aber das müsste ja noch irgendwie umgewandelt werden, da steh ich auf den schlauch

        Kommentar


          #5
          Also, normalerweise sollte das so gehen
          Code:
          String hexNumber = ...
          int decimal = Integer.parseInt(hexNumber, 16)
          Wobei ich mir grade nicht sicher bin, welchen import Du dafür setzen musst, ich tippe mal auf java.lang.Integer

          Kommentar


            #6
            versteh ich nicht so recht wie müsste das in der rule aussehen?

            Kommentar


              #7
              Naja, zuerst musst Du Deinen empfangenen String so aufteilen, dass Du die einzelnen HEX-Werte hast (ebenfalls als String). Die kannst Du dann mit der Methode parseInt(string,16) in ein Integer wandeln.
              Code:
              import java.lang.Integer
              
              rule "RFLINK_AUSWERTUNG"
              when
                  Item rfLinkRx received update
              then
                 ...
                  var String reading44444 = ...
                  var int iRead4 = Integer.parseInt(reading44444;16)
                 ...
                  var String reading55555 = ...
                  var int iRead5 = Integer.parseInt(reading55555;16)
                 ...
                  var String reading66666 = ...
                  var int iRead6 = Integer.parseInt(reading66666;16)
                  rfLinkid.postUpdate(iRead4)
                  rfLinkvo.postUpdate(iRead5)
                  rfLinkcu.postUpdate(iRead6)
              end
              Natürlich sollten die Zielitems dann vom Typ Number sein.

              EDIT: die 16 bedeutet, dass die Zahl zur Basis 16 gebildet wird...
              Zuletzt geändert von udo1toni; 10.01.2017, 08:17.

              Kommentar

              Lädt...
              X