Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Wallauer

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    W
    • Profile
    • Following 0
    • Followers 0
    • Topics 2
    • Posts 7
    • Best 2
    • Groups 1

    Wallauer

    @Wallauer

    3
    Reputation
    18
    Profile views
    7
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    Wallauer Follow
    Starter

    Best posts made by Wallauer

    • RE: Mehrere Items gleichzeitig für Influx/History aktivieren

      Hi zusammen,

      das habe ich auch gerade benötigt und habe es per Script erledigt.

      /*
          Funktion aktiviert Logging für Datenpunkt in SQL-Adapter mit folgenden Einstellungen
          - nur Änderungen aufzeichnen
          - bei gleichen Werten alle 300 Sekunden loggen
          - Änderungen erst nach 1 Sek. Aufzeichnen
          - Speicherdauer 3 Monate
          - Keine Delta-Kontrolle
      */
      function aktiviereSQL(datenpunkt, overwrite=false){
          var sql =  {
            "sql.0": {
              "enabled": true,
              "changesOnly": true,
              "debounce": "1000",
              "retention": "7948800",
              "changesRelogInterval": "300",
              "changesMinDelta": 0,
              "storageType": ""
            }
          };
          var obj = getObject(datenpunkt);
          // Wenn Objekt vorhanden und noch keine Custom-Einstellungen (sql-adapter) gemacht, wird SQL aktiviert
          if(obj.common && !obj.common.custom) {
              obj.common.custom = sql;
              setObject(datenpunkt, obj);
              console.log("DEBUG: SQL-Logging für den Datenpunkt " + datenpunkt + " wurde aktiviert !");
          }
          // Objekt vorhanden, Einstellungen schon gesetzt -> überschreiben
          else if(obj.common && obj.common.custom && overwrite) {
              obj.common.custom = sql;
              setObject(datenpunkt, obj);
              console.log("DEBUG: SQL-Logging für den Datenpunkt " + datenpunkt + " wurde überschrieben !");
          }
          else {
              console.log("DEBUG: SQL-Logging für den Datenpunkt " + datenpunkt + " konnte nicht aktiviert werden !");
          }
      }
      // Für diese states soll Logging aktiviert werden
      var loggen = ["power", "energy"];
      
      // hier suchen wir nach den states, Rückgabe ist die Objekt-ID
      var sensors = $('[state.id=javascript.0.ShellyPlugs.*]'); 
      
      console.log("DEBUG: Anzahl Sensoren -> " + sensors.length);
      sensors.each(function(id, i) {
          var wert = id.substring(id.lastIndexOf(".")+1);
      
          if(loggen.includes(wert)){
              console.log("DEBUG: Würde ausgeführt für -> " + id);
              aktiviereSQL(id); // oder aktiviereSQL(id, true); wenn überschreiben werden soll
          }
      });
      
      
      posted in ioBroker Allgemein
      W
      Wallauer
    • RE: Neuer Adapter: WS980wifi ELV direkt einlesen

      Hi zusammen,

      habe auch die besagte Wetterstation und habe sie über ein kleines Python-Script an ioBroker über die simpleAPI angebunden.
      Ist nicht die schönste Lösung, funktioniert aber einwandfrei ohne irgendwelche Wetterdienste dazwischen. Hätte lieber einen
      ioBroker-Adapter geschrieben, aber dazu fehlt mir momentan die Zeit.

      Danke für die Links oben, damit war die Anbindung ein Kinderspiel !

      Voraussetzungen:

      • die Wetterstation muss sich bereits in Eurem Netzwerk befinden (wifi-Mode-B, Anleitung auf ELV-Seite)
      • simple-API ist in der web-Instanz aktiviert
      • folgende Python-libs sind installiert: socket, requests, json, time, syslog

      Installation:

      • wetterstation.js in ioBroker unter "Skripte" hinzufügen und starten

      /*
          Abfrage der Wetterstation mittels wetterstation.py. Daten landen hier --> 
          http://[ioBroker-IP]:8082/setValueFromBody/javascript.0.API.Wetterstation_Eingang
      */
      
      // Anlegen der Datenpunkte unter javascript.0.Wetterstation
      function createOnce(){
          createState("javascript.0.API.Wetterstation_Eingang", "n/a", {read: true, write: true, name: "API Eingang fuer die pythonscript-Daten", type: "string", def: "n/a"});
          var name = "javascript.0.Wetterstation";
          createState(name);
          createState(name + ".tempHitzeIndex", 0, {read: true, write: true, name: "Temp. Hitzeindex", type: "number", def: "0"});
          createState(name + ".windBoe", 0, {read: true, write: true, name: "Windboe", type: "number", def: "0"});
          createState(name + ".regenJahr", 0, {read: true, write: true, name: "Niederschlag pro Jahr", type: "number", def: "0"});
          createState(name + ".regen", 0, {read: true, write: true, name: "Niederschlag pro Stunde", type: "number", def: "0"});
          createState(name + ".uvWert", 0, {read: true, write: true, name: "UV-Wert", type: "number", def: "0"});
          createState(name + ".regenGesamt", 0, {read: true, write: true, name: "Regen gesamt", type: "number", def: "0"});
          createState(name + ".licht", 0, {read: true, write: true, name: "Lichtstärke", type: "number", def: "0"});
          createState(name + ".regenWoche", 0, {read: true, write: true, name: "Niederschlag pro Woche", type: "number", def: "0"});
          createState(name + ".regenMonat", 0, {read: true, write: true, name: "Niederschlag pro Monat", type: "number", def: "0"});
          createState(name + ".regenTag", 0, {read: true, write: true, name: "Niederschlag diesen Tag", type: "number", def: "0"});
          createState(name + ".tempTaupunkt", 0, {read: true, write: true, name: "Taupunkt", type: "number", def: "0"});
          createState(name + ".windGeschwindigkeit", 0, {read: true, write: true, name: "Wind Geschwindgkeit", type: "number", def: "0"});
          createState(name + ".windRichtung", 0, {read: true, write: true, name: "Windrichtung", type: "number", def: "0"});
          createState(name + ".tempAussen", 0, {read: true, write: true, name: "Temp. Aussen", type: "number", def: "0"});
          createState(name + ".tempGefuehlt", 0, {read: true, write: true, name: "Temp. gefuehlt", type: "number", def: "0"});
          createState(name + ".tempInnen", 0, {read: true, write: true, name: "Temp. Innen", type: "number", def: "0"});
          createState(name + ".humAussen", 0, {read: true, write: true, name: "Luftfeuchte Aussen", type: "number", def: "0"});
          createState(name + ".pressAbs", 0, {read: true, write: true, name: "Luftdruck abs.", type: "number", def: "0"});
          createState(name + ".uvIndex", 0, {read: true, write: true, name: "UV-Index", type: "number", def: "0"});
          createState(name + ".pressRel", 0, {read: true, write: true, name: "Luftdruck rel.", type: "number", def: "0"});
          createState(name + ".humInnen", 0, {read: true, write: true, name: "Luftfeuchte Innen", type: "number", def: "0"});        
      }
      
      // Bei jedem Eingang der Daten, die Datenpunkte aktualisieren
      on({id: "javascript.0.API.Wetterstation_Eingang", change: "any"}, function (obj) {
          var data = JSON.parse(obj.newState.val);
          for (var key in data){
              setState("javascript.0.Wetterstation." + key, data[key]);  
          }
      });
      
      createOnce(); // muss nur beim ersten Start ausgeführt werden um Datenpunkte anzulegen, kann danach auskommentiert werden. 
      

      • wetterstation.py anlegen und ausführen (Hintergrunddienst bietet sich an)
      • ausführbar machen chmod +x wetterstation.py

      #!/usr/bin/env python
      
      """
          Programm holt die Daten einer WS980wifi-Wetterstation ab und sendet sie an simpleAPI von ioBroker
          Erstellt: 10.01.2020
      """
      
      import socket, requests, json, time, syslog
      
      ###################################################### Hier an Netzwerk anpassen #####################################################
      HOST = "10.0.30.26" # IP-Adresse der Wetterstation
      PORT = 45000        # Port der Wetterstatioin
      UPD_INTERVAL = 30   # Update-Intervall in Sekunden
      IOBROKER_API_URL = "http://10.0.10.10:8082/setValueFromBody/javascript.0.API.Wetterstation_Eingang" # API-URL von simpleAPI (ioBroker)
      ######################################################################################################################################
      
      # Diese Werte werden bei Aktuell-Anfrage in Bytestring zurueckgeliefert 
      WERTE = [
          {'name': 'tempInnen', 'start': 7, 'laenge': 2, 'div': 10},
          {'name': 'tempAussen', 'start': 10, 'laenge': 2, 'div': 10},
          {'name': 'tempTaupunkt', 'start': 13, 'laenge': 2, 'div': 10},
          {'name': 'tempGefuehlt', 'start': 16, 'laenge': 2, 'div': 10},
          {'name': 'tempHitzeIndex', 'start': 19, 'laenge': 2, 'div': 10},
          {'name': 'humInnen', 'start': 22, 'laenge': 1, 'div': 1},
          {'name': 'humAussen', 'start': 24, 'laenge': 1, 'div': 1},
          {'name': 'pressAbs', 'start': 26, 'laenge': 2, 'div': 10},
          {'name': 'pressRel', 'start': 29, 'laenge': 2, 'div': 10},
          {'name': 'windRichtung', 'start': 32, 'laenge': 2, 'div': 1},
          {'name': 'windGeschwindigkeit', 'start': 35, 'laenge': 2, 'div': 10},
          {'name': 'windBoe', 'start': 38, 'laenge': 2, 'div': 10},
          {'name': 'regen', 'start': 41, 'laenge': 4, 'div': 10},
          {'name': 'regenTag', 'start': 46, 'laenge': 4, 'div': 10},
          {'name': 'regenWoche', 'start': 51, 'laenge': 4, 'div': 10},
          {'name': 'regenMonat', 'start': 56, 'laenge': 4, 'div': 10},
          {'name': 'regenJahr', 'start': 61, 'laenge': 4, 'div': 10},
          {'name': 'regenGesamt', 'start': 66, 'laenge': 4, 'div': 10},
          {'name': 'licht', 'start': 71, 'laenge': 4, 'div': 10},
          {'name': 'uvWert', 'start': 76, 'laenge': 2, 'div': 10},
          {'name': 'uvIndex', 'start': 79, 'laenge': 1, 'div': 1},
      ]
      
      def sendeAnIoBroker(IOBROKER_API_URL, postdata):
          """
              Sendet die Daten als json an simpleAPI von ioBroker, so dass ueber Datenpunkte darauf zugegriffen werden kann
              postdata = dict
          """
          postdata = json.dumps(postdata)
          requests.post(IOBROKER_API_URL, postdata)
      
      def getValueFromResponse(response, name, start, laenge, div):
          """
              Liefert den angefragten Wert aus Response-Array als float-Wert zurueck
          """
          wert = "".join(response[start:start+laenge])
          wert_float = float(int(wert,16)) / div
          # print "%s => %s => %s" %(name, wert, wert_float)
          return wert_float
      
      def getDataFromWS():
          """
              Sendet eine Anfrage fuer aktuelle Daten an Server. Historische Daten werden nicht benoetigt, da ioBroker sich um Historie kuemmert.
              Liefert array mit Response-Bytes zurueck
          """
          # Bytes die an Wetterstation gesendet werden, um die aktuellen Werte als Rueckgabe zu erhalten
          ANFRAGE = "\xff\xff\x0b\x00\x06\x04\x04\x19"
      
          s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          s.connect((HOST,PORT))
          s.send(ANFRAGE)
          data = s.recv(1024)
          s.close()
          response = []
          for element in data:
              response.append(element.encode('hex'))
          return response
      
      def generateDataForIobroker(resp, werte):
          """
              Generiert ein dict mit Key/Values, die an ioBroker gesendet werden sollen
              Liefert ein dict zurueck
          """
          ioBrokerDaten = {}
          for wert in werte:
              ioBrokerDaten[wert['name']] = getValueFromResponse(resp,wert['name'], wert['start'], wert['laenge'], wert['div'])
          return ioBrokerDaten
      
      # Main
      while True:
          try:
              resp = getDataFromWS()
              daten = generateDataForIobroker(resp, WERTE)
              sendeAnIoBroker(IOBROKER_API_URL, daten)
          except:
              syslog.openlog(logoption=syslog.LOG_PID, facility=syslog.LOG_USER)
              syslog.syslog('ioBroker - Fehler beim Abfragen der Wetterstation !!!')
      
          time.sleep(UPD_INTERVAL)
      

      Script wetterstation.py als Hintergrunddienst via systemd in Linux starten:

      Datei /etc/systemd/system/wetterstation.service anlegen und Pfad zur wetterstation.py unter ExecStart anpassen

      [Unit]
      Description=Wetterstation-Update-Service
      After=network.target
      
      [Service]
      Type=simple
      ExecStart=/usr/local/sbin/wetterstation.py
      
      [Install]
      WantedBy=multi-user.target
      

      Danach den Dienst noch aktivieren (so dass er nach reboot wieder automatisch startet) und erstmalig starten

      systemctl enable wetterstation.service
      systemctl start wetterstation.service
      

      Sonstiges zur WS980:
      Die Wetterstation pingt minütlich im Wechsel amazon.com / baidu.com, wahrscheinlich um die Netzwerkanbindung zu erkennen.
      Weitere Verbindungen nach außen konnte ich nicht erkennen.

      posted in Entwicklung
      W
      Wallauer

    Latest posts made by Wallauer

    • RE: Mehrere Items gleichzeitig für Influx/History aktivieren

      Hi zusammen,

      das habe ich auch gerade benötigt und habe es per Script erledigt.

      /*
          Funktion aktiviert Logging für Datenpunkt in SQL-Adapter mit folgenden Einstellungen
          - nur Änderungen aufzeichnen
          - bei gleichen Werten alle 300 Sekunden loggen
          - Änderungen erst nach 1 Sek. Aufzeichnen
          - Speicherdauer 3 Monate
          - Keine Delta-Kontrolle
      */
      function aktiviereSQL(datenpunkt, overwrite=false){
          var sql =  {
            "sql.0": {
              "enabled": true,
              "changesOnly": true,
              "debounce": "1000",
              "retention": "7948800",
              "changesRelogInterval": "300",
              "changesMinDelta": 0,
              "storageType": ""
            }
          };
          var obj = getObject(datenpunkt);
          // Wenn Objekt vorhanden und noch keine Custom-Einstellungen (sql-adapter) gemacht, wird SQL aktiviert
          if(obj.common && !obj.common.custom) {
              obj.common.custom = sql;
              setObject(datenpunkt, obj);
              console.log("DEBUG: SQL-Logging für den Datenpunkt " + datenpunkt + " wurde aktiviert !");
          }
          // Objekt vorhanden, Einstellungen schon gesetzt -> überschreiben
          else if(obj.common && obj.common.custom && overwrite) {
              obj.common.custom = sql;
              setObject(datenpunkt, obj);
              console.log("DEBUG: SQL-Logging für den Datenpunkt " + datenpunkt + " wurde überschrieben !");
          }
          else {
              console.log("DEBUG: SQL-Logging für den Datenpunkt " + datenpunkt + " konnte nicht aktiviert werden !");
          }
      }
      // Für diese states soll Logging aktiviert werden
      var loggen = ["power", "energy"];
      
      // hier suchen wir nach den states, Rückgabe ist die Objekt-ID
      var sensors = $('[state.id=javascript.0.ShellyPlugs.*]'); 
      
      console.log("DEBUG: Anzahl Sensoren -> " + sensors.length);
      sensors.each(function(id, i) {
          var wert = id.substring(id.lastIndexOf(".")+1);
      
          if(loggen.includes(wert)){
              console.log("DEBUG: Würde ausgeführt für -> " + id);
              aktiviereSQL(id); // oder aktiviereSQL(id, true); wenn überschreiben werden soll
          }
      });
      
      
      posted in ioBroker Allgemein
      W
      Wallauer
    • RE: Basic HTML-Widget - Max. Bindings 50 ?

      @OliverIO
      Danke Dir !

      posted in Visualisierung
      W
      Wallauer
    • Basic HTML-Widget - Max. Bindings 50 ?

      Hi zusammen,
      ich habe mir gerade mittels HTML-Widget eine Tabelle gebaut, die einige Datenpunkte anzeigen soll.
      Ab Binding Nr. 50 aufwärts werden sie nicht mehr umgesetzt, sondern der Quellcode {javascript.0.ARLO.xxx} erscheint auf der gerenderten Seite.

      Gibt's hier einen Trick, die Anzahl der max bindings für das Widget hochzusetzen ?

      Mit besten Grüßen
      Wallauer

      posted in Visualisierung
      W
      Wallauer
    • RE: Neuinstallation mit sehr vielen Warnmeldungen zu sqlite !

      Hi zusammen,
      gleiches "Problem" auch bei mir. Adapterinstallation bzw. Update dauert ewig wegen sqlite. Ist die Installation "npm install sqlite3" sinnvoll, oder gibts einen anderen Weg, das zu verhindern ?
      Das entfernen von

      package-lock=false
      

      in der /opt/iobroker/.npmrc habe ich bereits getestet, hat aber keine Abhilfe geschaffen.

      Update: Lag an einem 403 von node-pre-gyp. Habe node von Version 10.x auf 12.x hochgezogen, jetzt hat sich das Problem (nach erster Prüfung) wohl erledigt.

      MfG
      Wallauer

      posted in ioBroker Allgemein
      W
      Wallauer
    • RE: Neuer Adapter: WS980wifi ELV direkt einlesen

      Hi zusammen,

      habe auch die besagte Wetterstation und habe sie über ein kleines Python-Script an ioBroker über die simpleAPI angebunden.
      Ist nicht die schönste Lösung, funktioniert aber einwandfrei ohne irgendwelche Wetterdienste dazwischen. Hätte lieber einen
      ioBroker-Adapter geschrieben, aber dazu fehlt mir momentan die Zeit.

      Danke für die Links oben, damit war die Anbindung ein Kinderspiel !

      Voraussetzungen:

      • die Wetterstation muss sich bereits in Eurem Netzwerk befinden (wifi-Mode-B, Anleitung auf ELV-Seite)
      • simple-API ist in der web-Instanz aktiviert
      • folgende Python-libs sind installiert: socket, requests, json, time, syslog

      Installation:

      • wetterstation.js in ioBroker unter "Skripte" hinzufügen und starten

      /*
          Abfrage der Wetterstation mittels wetterstation.py. Daten landen hier --> 
          http://[ioBroker-IP]:8082/setValueFromBody/javascript.0.API.Wetterstation_Eingang
      */
      
      // Anlegen der Datenpunkte unter javascript.0.Wetterstation
      function createOnce(){
          createState("javascript.0.API.Wetterstation_Eingang", "n/a", {read: true, write: true, name: "API Eingang fuer die pythonscript-Daten", type: "string", def: "n/a"});
          var name = "javascript.0.Wetterstation";
          createState(name);
          createState(name + ".tempHitzeIndex", 0, {read: true, write: true, name: "Temp. Hitzeindex", type: "number", def: "0"});
          createState(name + ".windBoe", 0, {read: true, write: true, name: "Windboe", type: "number", def: "0"});
          createState(name + ".regenJahr", 0, {read: true, write: true, name: "Niederschlag pro Jahr", type: "number", def: "0"});
          createState(name + ".regen", 0, {read: true, write: true, name: "Niederschlag pro Stunde", type: "number", def: "0"});
          createState(name + ".uvWert", 0, {read: true, write: true, name: "UV-Wert", type: "number", def: "0"});
          createState(name + ".regenGesamt", 0, {read: true, write: true, name: "Regen gesamt", type: "number", def: "0"});
          createState(name + ".licht", 0, {read: true, write: true, name: "Lichtstärke", type: "number", def: "0"});
          createState(name + ".regenWoche", 0, {read: true, write: true, name: "Niederschlag pro Woche", type: "number", def: "0"});
          createState(name + ".regenMonat", 0, {read: true, write: true, name: "Niederschlag pro Monat", type: "number", def: "0"});
          createState(name + ".regenTag", 0, {read: true, write: true, name: "Niederschlag diesen Tag", type: "number", def: "0"});
          createState(name + ".tempTaupunkt", 0, {read: true, write: true, name: "Taupunkt", type: "number", def: "0"});
          createState(name + ".windGeschwindigkeit", 0, {read: true, write: true, name: "Wind Geschwindgkeit", type: "number", def: "0"});
          createState(name + ".windRichtung", 0, {read: true, write: true, name: "Windrichtung", type: "number", def: "0"});
          createState(name + ".tempAussen", 0, {read: true, write: true, name: "Temp. Aussen", type: "number", def: "0"});
          createState(name + ".tempGefuehlt", 0, {read: true, write: true, name: "Temp. gefuehlt", type: "number", def: "0"});
          createState(name + ".tempInnen", 0, {read: true, write: true, name: "Temp. Innen", type: "number", def: "0"});
          createState(name + ".humAussen", 0, {read: true, write: true, name: "Luftfeuchte Aussen", type: "number", def: "0"});
          createState(name + ".pressAbs", 0, {read: true, write: true, name: "Luftdruck abs.", type: "number", def: "0"});
          createState(name + ".uvIndex", 0, {read: true, write: true, name: "UV-Index", type: "number", def: "0"});
          createState(name + ".pressRel", 0, {read: true, write: true, name: "Luftdruck rel.", type: "number", def: "0"});
          createState(name + ".humInnen", 0, {read: true, write: true, name: "Luftfeuchte Innen", type: "number", def: "0"});        
      }
      
      // Bei jedem Eingang der Daten, die Datenpunkte aktualisieren
      on({id: "javascript.0.API.Wetterstation_Eingang", change: "any"}, function (obj) {
          var data = JSON.parse(obj.newState.val);
          for (var key in data){
              setState("javascript.0.Wetterstation." + key, data[key]);  
          }
      });
      
      createOnce(); // muss nur beim ersten Start ausgeführt werden um Datenpunkte anzulegen, kann danach auskommentiert werden. 
      

      • wetterstation.py anlegen und ausführen (Hintergrunddienst bietet sich an)
      • ausführbar machen chmod +x wetterstation.py

      #!/usr/bin/env python
      
      """
          Programm holt die Daten einer WS980wifi-Wetterstation ab und sendet sie an simpleAPI von ioBroker
          Erstellt: 10.01.2020
      """
      
      import socket, requests, json, time, syslog
      
      ###################################################### Hier an Netzwerk anpassen #####################################################
      HOST = "10.0.30.26" # IP-Adresse der Wetterstation
      PORT = 45000        # Port der Wetterstatioin
      UPD_INTERVAL = 30   # Update-Intervall in Sekunden
      IOBROKER_API_URL = "http://10.0.10.10:8082/setValueFromBody/javascript.0.API.Wetterstation_Eingang" # API-URL von simpleAPI (ioBroker)
      ######################################################################################################################################
      
      # Diese Werte werden bei Aktuell-Anfrage in Bytestring zurueckgeliefert 
      WERTE = [
          {'name': 'tempInnen', 'start': 7, 'laenge': 2, 'div': 10},
          {'name': 'tempAussen', 'start': 10, 'laenge': 2, 'div': 10},
          {'name': 'tempTaupunkt', 'start': 13, 'laenge': 2, 'div': 10},
          {'name': 'tempGefuehlt', 'start': 16, 'laenge': 2, 'div': 10},
          {'name': 'tempHitzeIndex', 'start': 19, 'laenge': 2, 'div': 10},
          {'name': 'humInnen', 'start': 22, 'laenge': 1, 'div': 1},
          {'name': 'humAussen', 'start': 24, 'laenge': 1, 'div': 1},
          {'name': 'pressAbs', 'start': 26, 'laenge': 2, 'div': 10},
          {'name': 'pressRel', 'start': 29, 'laenge': 2, 'div': 10},
          {'name': 'windRichtung', 'start': 32, 'laenge': 2, 'div': 1},
          {'name': 'windGeschwindigkeit', 'start': 35, 'laenge': 2, 'div': 10},
          {'name': 'windBoe', 'start': 38, 'laenge': 2, 'div': 10},
          {'name': 'regen', 'start': 41, 'laenge': 4, 'div': 10},
          {'name': 'regenTag', 'start': 46, 'laenge': 4, 'div': 10},
          {'name': 'regenWoche', 'start': 51, 'laenge': 4, 'div': 10},
          {'name': 'regenMonat', 'start': 56, 'laenge': 4, 'div': 10},
          {'name': 'regenJahr', 'start': 61, 'laenge': 4, 'div': 10},
          {'name': 'regenGesamt', 'start': 66, 'laenge': 4, 'div': 10},
          {'name': 'licht', 'start': 71, 'laenge': 4, 'div': 10},
          {'name': 'uvWert', 'start': 76, 'laenge': 2, 'div': 10},
          {'name': 'uvIndex', 'start': 79, 'laenge': 1, 'div': 1},
      ]
      
      def sendeAnIoBroker(IOBROKER_API_URL, postdata):
          """
              Sendet die Daten als json an simpleAPI von ioBroker, so dass ueber Datenpunkte darauf zugegriffen werden kann
              postdata = dict
          """
          postdata = json.dumps(postdata)
          requests.post(IOBROKER_API_URL, postdata)
      
      def getValueFromResponse(response, name, start, laenge, div):
          """
              Liefert den angefragten Wert aus Response-Array als float-Wert zurueck
          """
          wert = "".join(response[start:start+laenge])
          wert_float = float(int(wert,16)) / div
          # print "%s => %s => %s" %(name, wert, wert_float)
          return wert_float
      
      def getDataFromWS():
          """
              Sendet eine Anfrage fuer aktuelle Daten an Server. Historische Daten werden nicht benoetigt, da ioBroker sich um Historie kuemmert.
              Liefert array mit Response-Bytes zurueck
          """
          # Bytes die an Wetterstation gesendet werden, um die aktuellen Werte als Rueckgabe zu erhalten
          ANFRAGE = "\xff\xff\x0b\x00\x06\x04\x04\x19"
      
          s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          s.connect((HOST,PORT))
          s.send(ANFRAGE)
          data = s.recv(1024)
          s.close()
          response = []
          for element in data:
              response.append(element.encode('hex'))
          return response
      
      def generateDataForIobroker(resp, werte):
          """
              Generiert ein dict mit Key/Values, die an ioBroker gesendet werden sollen
              Liefert ein dict zurueck
          """
          ioBrokerDaten = {}
          for wert in werte:
              ioBrokerDaten[wert['name']] = getValueFromResponse(resp,wert['name'], wert['start'], wert['laenge'], wert['div'])
          return ioBrokerDaten
      
      # Main
      while True:
          try:
              resp = getDataFromWS()
              daten = generateDataForIobroker(resp, WERTE)
              sendeAnIoBroker(IOBROKER_API_URL, daten)
          except:
              syslog.openlog(logoption=syslog.LOG_PID, facility=syslog.LOG_USER)
              syslog.syslog('ioBroker - Fehler beim Abfragen der Wetterstation !!!')
      
          time.sleep(UPD_INTERVAL)
      

      Script wetterstation.py als Hintergrunddienst via systemd in Linux starten:

      Datei /etc/systemd/system/wetterstation.service anlegen und Pfad zur wetterstation.py unter ExecStart anpassen

      [Unit]
      Description=Wetterstation-Update-Service
      After=network.target
      
      [Service]
      Type=simple
      ExecStart=/usr/local/sbin/wetterstation.py
      
      [Install]
      WantedBy=multi-user.target
      

      Danach den Dienst noch aktivieren (so dass er nach reboot wieder automatisch startet) und erstmalig starten

      systemctl enable wetterstation.service
      systemctl start wetterstation.service
      

      Sonstiges zur WS980:
      Die Wetterstation pingt minütlich im Wechsel amazon.com / baidu.com, wahrscheinlich um die Netzwerkanbindung zu erkennen.
      Weitere Verbindungen nach außen konnte ich nicht erkennen.

      posted in Entwicklung
      W
      Wallauer
    • RE: [Gelöst]Subscribe/on und Arrays

      Vielen Dank für die schnelle Antwort AlCalzone,

      Du hast meinen Sonntag gerettet 😉

      posted in Skripten / Logik
      W
      Wallauer
    • [Gelöst]Subscribe/on und Arrays

      Hallo zusammen,

      ich bin gerade dabei, von FHEM auf ioBroker zu wechseln und habe ein kleines Problem mit einem ersten kleinen Script, welches die letzte Öffnung des jeweiligen Fenstersensors in einen state wegschreiben soll.

      Die states habe ich alle entsprechend angelegt (siehe ganz unten) und es funktioniert auch, bis auf eine "Kleinigkeit". Egal welches Fenster ich öffne, es wird immer in die states von fs.length - 1 geschrieben, also KellerTuer.

      `var fs = [];
      fs.push({id:"OEQ0XXXX1", name:"GaesteWC"});
      fs.push({id:"MEQ0XXXX2", name:"Bad"});
      fs.push({id:"MEQ0XXXX3", name:"BueroTerrassenTuer"});
      fs.push({id:"OEQ0XXXX4", name:"Buero"});
      fs.push({id:"MEQ0XXXX5", name:"KuecheTerrassenTuer"});
      fs.push({id:"OEQ0XXXX6", name:"Kueche"});
      fs.push({id:"MEQ0XXXX7", name:"WohnzimmerTerrassenTuer"});
      fs.push({id:"OEQ0XXXX8", name:"WohnzimmerGartenLinks"});
      fs.push({id:"OEQ0XXXX9", name:"WohnzimmerGartenRechts"});
      fs.push({id:"OEQ0XXX10", name:"WohnzimmerStrasseLinks"});
      fs.push({id:"OEQ0XXX11", name:"WohnzimmerStrasseRechts"});
      fs.push({id:"OEQ0XXX12", name:"SchlafzimmerLinks"});
      fs.push({id:"OEQ0XXX13", name:"SchlafzimmerRechts"});
      fs.push({id:"MEQ0XXX14", name:"EingangsTuer"});
      fs.push({id:"OEQ0XXX15", name:"KellerTreppe"});
      fs.push({id:"OEQ0XXX16", name:"KellerDusche"});
      fs.push({id:"OEQ0XXX17", name:"KellerZimmerRechts"});
      fs.push({id:"OEQ0XXX18", name:"KellerZimmerLinks"});
      fs.push({id:"OEQ0XXX19", name:"KellerTuer"});
      
      for (var i=0; i<fs.length; i++){/var/triggername="hm-rpc.0." +/fs[i].id/".1.state";/setnamea="Fenstersensoren." fs[i].name/".open";/setnameb="Fenstersensoren." ".lastopen";/log("trigger:/"/setnamea:/setnameb:/setnameb);/on({id:/triggername,/change:/"ne"},/function(obj)/{/setstate(setnamea,/obj.state.val);/if(obj.state.val="==" true){/zeitpunkt="formatDate(obj.state.ts," "dd.mm.yyyy/hh:mm");/setstate(setnameb,/zeitpunkt);/}/});/<e=""></fs.length;>`
      
      P.S.: Ich bin mir bewusst, dass es über RegExp auch einfacher geht, aber es geht mir hier erstmal um ein Grundverständnis, warum
      
      die in der Schleife angelegten subscribes nicht, wie vom mir erwartet, funktionieren. 
      
      Die jeweiligen Objekte unter javascript.0 sehen folgendermaßen aus:
      `~~[code]~~/* Einmaliges Anlegen der Objekte
      
      for (var i=0; i<fs.length; i++){/var/name="Fenstersensoren." +/fs[i].name;/createstate(name,/fs[i].id);/createstate(name/".open",/false,/{read:/true,/write:/name:/"fenster/offen?",/type:/"boolean",/def:/false});/".lowbat",/"batterie/leer/?",/".lastopen",/"n/a",/"beschreibung",/"string",/a"});/}/*/<e=""></fs.length;>`[/i][/i][/code][/i][/i][/i]
      
      posted in Skripten / Logik
      W
      Wallauer
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo