Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Entwicklung
  4. [Adapteranfrage] Orbit B-HYVE Ventil

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.3k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.3k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.6k

[Adapteranfrage] Orbit B-HYVE Ventil

Geplant Angeheftet Gesperrt Verschoben Entwicklung
adapterentwicklungventilgartenbewässerung
21 Beiträge 6 Kommentatoren 3.5k Aufrufe 8 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • OstfrieseUnterwegsO Offline
    OstfrieseUnterwegsO Offline
    OstfrieseUnterwegs
    schrieb am zuletzt editiert von
    #12

    Habt Ihr nur das Ventil, oder brauchts noch irgendein Gateway?

    K T 2 Antworten Letzte Antwort
    0
    • OstfrieseUnterwegsO OstfrieseUnterwegs

      Habt Ihr nur das Ventil, oder brauchts noch irgendein Gateway?

      K Offline
      K Offline
      kenny384
      schrieb am zuletzt editiert von
      #13

      @OstfrieseUnterwegs Ich habe auch das Gateway, ich weiß nicht ob das ganze hier auch ohne gehen würde.

      1 Antwort Letzte Antwort
      0
      • OstfrieseUnterwegsO OstfrieseUnterwegs

        Habt Ihr nur das Ventil, oder brauchts noch irgendein Gateway?

        T Offline
        T Offline
        tazdevil20
        schrieb am zuletzt editiert von
        #14

        @OstfrieseUnterwegs
        Wenn Du nur das Ventil hast funktioniert das über Bluetooth mit dem Handy über die App.
        Um es über ioBroker zu steuern ist der Hub zwingend notwendig. Dieser verbindet das Ventil mittels Bluetooth und ist auch gleichzeitig im WLAN.

        @kenny384
        Von meinem Script nicht zuviel erwarten. Ich möchte einfach nur die Batterieanzeige noch haben und idealerweise noch wissen wieviel Wasser ich pro Tag "verschwendet" habe.
        Batterie ist kein Thema. Jedoch kann ich in dem JSON noch nicht sehen wieviel Wasser verbraucht wurde. Auf der Homepage und in der App von Orbit schon. Die Daten müssen entsprechend vorhanden sein.

        @backons
        Danke für den Tipp mit dem Neustart. Hatte heute morgen auch das Gefühl (nicht genauer betrachtet), dass ich keine Verbindung mehr zu dem Ventil hatte. Nach einem Neustart (war einfach nur ein Test) schon.

        Ich habe aktuell auch keine Bodenfeuchtesensoren im Garten. Preisgünstig sind die von xiaomi welche jedoch eigentlich nicht für außen gedacht sind und auch nur mittels Bluetooth und nicht über Zigbee laufen. Ansonsten habe ich mich mal mit einer Eigenbaulösung versucht. Daran bin ich aber gescheitert, da ich zu wenig Löt erfahrung habe.

        Ich starte über ein Script meine Bewässerung. Habe hinter dem Orbit-Ventil noch vier Magnetventile welche dann die je eine Wasserpipeline versorgen. Diese werden im Abstand von x Minuten abgewechselt. Ich möchte an der Stelle auch keine intelligente Automatisierung, da vorher noch der Mähroboter fahren soll und davor muss der Garten Kinderfrei und aufgeräumt sein.

        1 Antwort Letzte Antwort
        0
        • T Offline
          T Offline
          tazdevil20
          schrieb am zuletzt editiert von tazdevil20
          #15

          Hi,

          nach ein paar Schwierigkeiten mit dem Gerät habe ich es halbwegs zufriedenstellend gelöst.
          Das nur mal nebenbei: Ich habe den Filter ausgebaut und einen Dichtring ohne Filter eingesetzt. Danach haben meine Sprinkler wieder annähernd das gemacht was sie sollten. Problem ist bei mir, dass der Wasserdruck nicht so hoch ist.

          Das zusätzliche Script zu dem Bedienen ist für meine Bedürfnisse fertig. Ist ganz sicher nicht wirklich gut gebaut und ist auch vieles "geklaut", da ich von Websocket keine Ahnung habe.

          Es müssen ein paar Parameter manuell im Script gesetzt werden und die Objekte in ioBroker werden auch nicht automatisiert erstellt.

          Ich habe nur die Dinge herausgepickt welche für mich interessant sind.

          Es darf natürlich jeder das Script verbessern :blush:

          EDIT: Habe das Script angepasst um die Historie des Ventils komplett auszulesen und als JSON in ein Objekt zu schreiben.
          EDIT2: Da ich gerade dran bin. Kleine Verbesserung des History-JSON (saubere Sortierung wenn mehrfach am Tag eingeschaltet und Laufzeit nicht in Dezimal dargestellt)

          /*
           * orbit.js
           *
           * unofficial Orbit Bhyve API module
           * Bill Church - https://github.com/billchurch/bhyve-mqtt
           *
           */
          
          //todo implement https://github.com/websockets/ws/wiki/client-auto-reconnect-with-ping-listener---exponential-back-off-timeout
          
          const axios = require('axios')
          const EventEmitter = require('events').EventEmitter
          const inherits = require('util').inherits
          const WebSocket = require('ws')
          const Ajv = require('ajv')
          let ts = () => new Date().toISOString()
          
          var mCLIENT_ONLINE = false
          var MCLIENT_ONLINE = false
          var DevicesJSON, WateringJSON, device_id, feed;
          var obj = [];
          var objtmp = [];
          
          // ************************************************************
          var man_deviceID = 'Die Device ID des Ventils (zu finden z. B. hier https://techsupport.orbitbhyve.com)'
          var man_email = 'Orbit eMail-Adresse hier eintragen!'
          var man_password = 'Orbit Passwort hier eintragen'
          var wateringJSON_iobroker = 'javascript.0.bHyve.Watering_JSON';
          // ************************************************************
          
          function minTommss(minutes){
           var sign = minutes < 0 ? "-" : "";
           var min = Math.floor(Math.abs(minutes));
           var sec = Math.floor((Math.abs(minutes) * 60) % 60);
           return sign + (min < 10 ? "0" : "") + min + ":" + (sec < 10 ? "0" : "") + sec;
          }
          
          function Client () {
            if (!(this instanceof Client)) { return new Client() }
            EventEmitter.call(this)
          
            this.config = {
              wssURL: undefined,
              baseURL: undefined,
              timeout: undefined,
              email: undefined,
              password: undefined,
              debug: undefined
            }
            this._token = undefined
            this._user_id = undefined
            this._device_id = undefined
          }
          inherits(Client, EventEmitter)
          
          // first step, get a token and generate an event on success or fail
          Client.prototype.connect = function (cfg) {
            this.config.baseURL = cfg.baseURL || 'https://api.orbitbhyve.com'
            this.config.timeout = cfg.timeout || 10000
            this.config.email = cfg.email || undefined
            this.config.password = cfg.password || undefined
            this.config.wssURL = cfg.wssURL || 'wss://api.orbitbhyve.com/v1/events'
              this.config.wsTimeout = cfg.wsTimeout || 10000
            this.config.debug = cfg.debug || true
            var self = this
          
            const getOrbitToken = () => {
              return new Promise((resolve, reject) => {
                const instance = axios.create({
                  baseURL: self.config.baseURL,
                  timeout: self.config.timeout
                })
                instance.post('/v1/session', {
                  'session': {
                    'email': self.config.email,
                    'password': self.config.password
                  }
                }).then(function (response) {
                  self._token = response.data.orbit_session_token
                  self._user_id = response.data.user_id
                  // config for later sessions
                  self._rest_config = { baseURL: self.config.baseURL, timeout: self.config.timeout, headers: { 'orbit-session-token': self._token } }
                  //if (self.config.debug) log(`${ts()} - response.data: ` + JSON.stringify(response.data))
                  resolve(response)
                }).catch(function (err) {
                  reject(err)
                })
              })
            }
          
            const doAccept = (response) => {
              //if (self.config.debug) log(`${ts()} - token: ` + self._token + ' My UserID: ' + self._user_id)
              self.emit('token', self._token)
              self.emit('user_id', self._user_id)
            }
            const doReject = (err) => {
              if (self.config.debug) log(`${ts()} - error ` + err)
              self.emit('error', err)
            }
          
            let ost = getOrbitToken()
            ost.then(doAccept)
              .catch(doReject)
          }
          
          Client.prototype.devices = function () {
            var self = this
          
            const getDevices = () => {
              return new Promise((resolve, reject) => {
                const instance = axios.create(self._rest_config)
                
                instance.get('/v1/devices?user_id=' + self._user_id)
                  .then(function (response) {
                    if (self.config.debug) {
                      //log(`${ts()} - response.json: ` + JSON.stringify(response.data))
                      DevicesJSON = response.data
                    } 
                    self._device_id = response.data[0].id
                    device_id = response.data[1].id
                    
                    resolve(response)
                  }).catch(function (err) {
                    reject(err)
                  })
          
                  instance.get('/v1/watering_events/' + man_deviceID)
                  .then(function (response_watering) {
                      //log(`${ts()} - response.json - watering_events: ` + JSON.stringify(response.data))
                      WateringJSON = response_watering.data
          
                      for (var i = 0; i < Object.keys(WateringJSON).length; i++) {
                          objtmp = [];
                          for (var j = 0; j < Object.keys(WateringJSON[i].irrigation).length; j++) {
                              let watering_start = formatDate(WateringJSON[i].irrigation[j].start_time, 'DD.MM. hh:mm');
                              let watering_runtime =  minTommss(parseFloat(Number(parseFloat(WateringJSON[i].irrigation[j].run_time)).toFixed(2)));
                              let watering_liter = parseFloat(Number((WateringJSON[i].irrigation[j].water_volume_gal)*3.78541).toFixed(2));
          
                              feed = {Start: watering_start, Laufzeit: watering_runtime + " min",Liter: watering_liter}
                              if(j==0) {
                                  objtmp.push(feed);
                              } else {
                                  objtmp.unshift(feed);
                              }
                          };
                          obj = obj.concat(objtmp)
                      };
                      setState(wateringJSON_iobroker, JSON.stringify(obj));
                      //resolve(response_watering)
                  }).catch(function (err) {
                    //reject(err)
                  })
              })
            }
          
            const doAccept = (response) => {
              //if (self.config.debug) console.log(`${ts()} - response.data2: ` + JSON.stringify(response.data))
              self.emit('devices', response.data)
              self.emit('device_id', self._device_id)
            }
          
            const doReject = (err) => {
              if (self.config.debug) log(`${ts()} - error: ` + err)
              self.emit('error', err)
            }
          
            let Devices = getDevices()
            Devices.then(doAccept)
              .catch(doReject)
          }
          
          Client.prototype.send = function (message) {
            var self = this
          
            self._stream.send(JSON.stringify(message))
            log('send json: ' + JSON.stringify(message))
          }
          
          Client.prototype.connectStream = function () {
            var self = this
          
            self._stream = new WebSocket(self.config.wssURL, {
              handshakeTimeout: self.config.wsTimeout
            })
          
            function sendPing() {
              if (self.config.debug) log(`${ts()} - websocket sending ping`)
              self._stream.send('{"event":"ping"}')
              log("ping")
            }
          
            const authenticate = () => {
              let message = {
                'event': 'app_connection',
                'orbit_session_token': self._token
              }
          
              if (self.config.debug) log(`${ts()} - websocket authenticate message: ` + JSON.stringify(message))
          
              self._stream.send(JSON.stringify(message))
              setInterval(sendPing, 25 * 1000)
            }
          
            self._stream.on('open', authenticate)
          
            self._stream.on('message', function (data) {
              self.emit('message', JSON.parse(data))
            })
          
            self._stream.on('error', function (err) {
              self.emit('error', err)
            })
          
            self._stream.on('close', function (num, reason) {
              if (self.config.debug) log(`${ts()} - close: ` + num + ' reason: ' + reason)
            })
          
            self._stream.on('ping', function (data) {
              if (self.config.debug) log(`${ts()} - ping data: ` + data)
            })
          
            self._stream.on('unexpected-response', function (request, response) {
              console.error(`${ts()} - unexpected-response / request: ` + request + ' response: ' + response)
            })
          }
          
          //Vorbereitung für Login
          var oClient = Client();
          
          //Login
          oClient.connect({
              email: man_email,
              password: man_password
          });
          
          //get Token
          oClient.on('token', (token) => {
            //if (MCLIENT_ONLINE) mClient.publish('bhyve/alive', ts(), publishHandler)
            //console.log(`${ts()} - Token: ${token}`)
          })
          
          oClient.on('user_id', (userId) => {
            //console.log(`${ts()} - user_id: ${userId}`)
            oClient.devices()
          })
          
          oClient.on('device_id', (deviceId) => {
            //console.log(`${ts()} - device_id: ${deviceId}`)
          })
          
          oClient.on('devices', (data) => {
              var objects = JSON.parse(JSON.stringify(DevicesJSON))
              objects.forEach(function(key, index){
                  //log("Name: " + key.name); 
                  //log("Type: " + key.type);
                  //log("Firmware-Version: " + key.firmware_version);
                  //log("Hardware-Version: " + key.hardware_version);
                  if(key.type == "bridge") {
                      //log("Last connect: " + key.last_connected_at);
                  };
                  //log("MAC: " + key.mac_address);
                  //log("Connected: " + key.is_connected);
                  if(key.type == "sprinkler_timer") {
                      //log("Run-Mode: " + key.status.run_mode);
                      //log("Battery: " + key.battery.percent);
                      setState('javascript.0.bHyve.Battery', key.battery.percent);
                  }
              });
          });
          
          
          HauWi112H 1 Antwort Letzte Antwort
          0
          • T Offline
            T Offline
            tazdevil20
            schrieb am zuletzt editiert von
            #16

            noch ein Update:
            Mich hat es gestört, dass ich nur maximal 3600 Sekunden (Objekt ist darauf beschränkt und anpassen hat nichts gebracht) das Wasser laufen lassen kann. Teilweise benötige ich auf grund der 4 Pipelines mehr Zeit. Meine Lösung war nun, dass ich die platform.js des Homebridge Moduls angepasst habe:

            Zeile 301:

            let run_time = valveService.getCharacteristic(Characteristic.SetDuration).value / 60;
            

            geändert auf

            let run_time = valveService.getCharacteristic(Characteristic.SetDuration).value;
            

            Zeile 341:

            service.getCharacteristic(Characteristic.RemainingDuration).updateValue(jsonData['run_time'] * 60);
            

            geändert auf

            service.getCharacteristic(Characteristic.RemainingDuration).updateValue(jsonData['run_time']);
            

            Somit gebe ich keine Sekunden mehr vor sondern Minuten. Über das Bewässerungsscript lasse ich das Ventil eh schließen. Somit ist das nur der doppelte Boden.

            1 Antwort Letzte Antwort
            0
            • K kenny384

              @tazdevil20 Sorry, zu früh geschrieben, ich habe es eben selber gefunden. Active muss man auf "1" setzen. Und ich glaube ich habe auch dein Problem mit der Bewässerungsdauer gelöst. Du musst eigentlich nur den Wert Set-Duration (in Sekunden) hoch setzen. Habe da mal 600 eingetragen, dann lief es auch manuell gestartet 10 Minuten.

              Bildschirmfoto 2020-07-27 um 10.13.16.png

              HauWi112H Offline
              HauWi112H Offline
              HauWi112
              schrieb am zuletzt editiert von
              #17

              @kenny384 sagte in [Adapteranfrage] Orbit B-HYVE Ventil:

              @tazdevil20 Sorry, zu früh geschrieben, ich habe es eben selber gefunden. Active muss man auf "1" setzen. Und ich glaube ich habe auch dein Problem mit der Bewässerungsdauer gelöst. Du musst eigentlich nur den Wert Set-Duration (in Sekunden) hoch setzen. Habe da mal 600 eingetragen, dann lief es auch manuell gestartet 10 Minuten.

              Bildschirmfoto 2020-07-27 um 10.13.16.png

              Hallo,
              egal, auf welchen wert ich "Set-Duration" setze...
              nach dem "Akivieren" wird immer 5min bewässert. Was mache ich falsch?

              708f4839-ed0b-4379-b93e-fb8bf25bfd0a-grafik.png
              a70e11e4-7ed5-4670-ba17-e99377001908-grafik.png

              vielen Dank im Voraus!

              1 Antwort Letzte Antwort
              0
              • B backons

                Hallo,

                den ham-adapter installieren. Dort dann bei npm module das eintragen:
                homebridge-platform-orbit
                Das ist die Seite dazu:
                https://github.com/MortJC/homebridge-platform-orbit

                Von dort dann die Konfiguration übernehmen und anpassen.
                Dann lässt es sich über iobroker steuern.

                M Offline
                M Offline
                MichaR
                schrieb am zuletzt editiert von
                #18

                @backons sagte in [Adapteranfrage] Orbit B-HYVE Ventil:

                Hallo,

                den ham-adapter installieren. Dort dann bei npm module das eintragen:
                homebridge-platform-orbit
                Das ist die Seite dazu:
                https://github.com/MortJC/homebridge-platform-orbit

                Von dort dann die Konfiguration übernehmen und anpassen.
                Dann lässt es sich über iobroker steuern.

                Hallo,
                ich habe mal diesen Thread ausgegraben, weil ich mir gerade 7 Stück orbit-Ventile installiert habe und ich diese im ioBroker nicht zum laufen bringe. Ich würde diese gern über ioBroker/Raspberrymatic steuern.
                Ich habe im ioBroker den ham installiert. In der Konfigurationsdatei ist als Beispielname "orbit" eingetragen. Sorry, welcher Name kommt dort hin? Habe meinen Accountnamen (Vor- und Nachname) eingetragen, den Ventilnamen, den Gruppennamen, aber es wird kein Objekt angelegt. Die Instanz ham läuft und laut log auch ohne Fehler, leider auch ohne Objekt. Hat jemand einen Tip? Vielen Dank.
                Hier mal mein log-file:
                ham.0 2021-07-27 12:15:41.599 info (18475) All Libraries installed/updated
                ham.0 2021-07-27 12:15:41.598 info (18475) Install/Update homebridge-platform-orbit
                ham.0 2021-07-27 12:15:41.598 info (18475) Install/Update the following Libraries: homebridge-platform-orbit
                ham.0 2021-07-27 12:15:41.584 info (18475) starting. Version 4.0.2 in /opt/iobroker/node_modules/iobroker.ham, node: v12.21.0, js-controller: 3.2.16
                ham.0 2021-07-27 12:15:37.920 info (18357) Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason
                ham.0 2021-07-27 12:15:37.919 info (18357) terminating
                ham.0 2021-07-27 12:15:37.876 info (18357) cleaned everything up...
                ham.0 2021-07-27 12:15:37.875 info (18357) Got terminate signal TERMINATE_YOURSELF
                ham.0 2021-07-27 12:14:00.774 info (18357) All Libraries installed/updated
                ham.0 2021-07-27 12:14:00.773 info (18357) Install/Update homebridge-platform-orbit
                ham.0 2021-07-27 12:14:00.773 info (18357) Install/Update the following Libraries: homebridge-platform-orbit
                ham.0 2021-07-27 12:14:00.752 info (18357) starting. Version 4.0.2 in /opt/iobroker/node_modules/iobroker.ham, node: v12.21.0, js-controller: 3.2.16
                ham.0 2021-07-27 12:13:57.137 info (18254) Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason
                ham.0 2021-07-27 12:13:57.137 info (18254) terminating
                ham.0 2021-07-27 12:13:57.060 info (18254) cleaned everything up...
                ham.0 2021-07-27 12:13:57.059 info (18254) Got terminate signal TERMINATE_YOURSELF
                ham.0 2021-07-27 12:12:18.550 info (18254) All Libraries installed/updated
                ham.0 2021-07-27 12:12:18.549 info (18254) Install/Update homebridge-platform-orbit
                ham.0 2021-07-27 12:12:18.549 info (18254) Install/Update the following Libraries: homebridge-platform-orbit
                ham.0 2021-07-27 12:12:18.535 info (18254) starting. Version 4.0.2 in /opt/iobroker/node_modules/iobroker.ham, node: v12.21.0, js-controller: 3.2.16
                ham.0 2021-07-27 12:12:14.795 info (17370) Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason
                ham.0 2021-07-27 12:12:14.794 info (17370) terminating
                ham.0 2021-07-27 12:12:14.748 info (17370) cleaned everything up...

                M 1 Antwort Letzte Antwort
                0
                • M MichaR

                  @backons sagte in [Adapteranfrage] Orbit B-HYVE Ventil:

                  Hallo,

                  den ham-adapter installieren. Dort dann bei npm module das eintragen:
                  homebridge-platform-orbit
                  Das ist die Seite dazu:
                  https://github.com/MortJC/homebridge-platform-orbit

                  Von dort dann die Konfiguration übernehmen und anpassen.
                  Dann lässt es sich über iobroker steuern.

                  Hallo,
                  ich habe mal diesen Thread ausgegraben, weil ich mir gerade 7 Stück orbit-Ventile installiert habe und ich diese im ioBroker nicht zum laufen bringe. Ich würde diese gern über ioBroker/Raspberrymatic steuern.
                  Ich habe im ioBroker den ham installiert. In der Konfigurationsdatei ist als Beispielname "orbit" eingetragen. Sorry, welcher Name kommt dort hin? Habe meinen Accountnamen (Vor- und Nachname) eingetragen, den Ventilnamen, den Gruppennamen, aber es wird kein Objekt angelegt. Die Instanz ham läuft und laut log auch ohne Fehler, leider auch ohne Objekt. Hat jemand einen Tip? Vielen Dank.
                  Hier mal mein log-file:
                  ham.0 2021-07-27 12:15:41.599 info (18475) All Libraries installed/updated
                  ham.0 2021-07-27 12:15:41.598 info (18475) Install/Update homebridge-platform-orbit
                  ham.0 2021-07-27 12:15:41.598 info (18475) Install/Update the following Libraries: homebridge-platform-orbit
                  ham.0 2021-07-27 12:15:41.584 info (18475) starting. Version 4.0.2 in /opt/iobroker/node_modules/iobroker.ham, node: v12.21.0, js-controller: 3.2.16
                  ham.0 2021-07-27 12:15:37.920 info (18357) Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason
                  ham.0 2021-07-27 12:15:37.919 info (18357) terminating
                  ham.0 2021-07-27 12:15:37.876 info (18357) cleaned everything up...
                  ham.0 2021-07-27 12:15:37.875 info (18357) Got terminate signal TERMINATE_YOURSELF
                  ham.0 2021-07-27 12:14:00.774 info (18357) All Libraries installed/updated
                  ham.0 2021-07-27 12:14:00.773 info (18357) Install/Update homebridge-platform-orbit
                  ham.0 2021-07-27 12:14:00.773 info (18357) Install/Update the following Libraries: homebridge-platform-orbit
                  ham.0 2021-07-27 12:14:00.752 info (18357) starting. Version 4.0.2 in /opt/iobroker/node_modules/iobroker.ham, node: v12.21.0, js-controller: 3.2.16
                  ham.0 2021-07-27 12:13:57.137 info (18254) Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason
                  ham.0 2021-07-27 12:13:57.137 info (18254) terminating
                  ham.0 2021-07-27 12:13:57.060 info (18254) cleaned everything up...
                  ham.0 2021-07-27 12:13:57.059 info (18254) Got terminate signal TERMINATE_YOURSELF
                  ham.0 2021-07-27 12:12:18.550 info (18254) All Libraries installed/updated
                  ham.0 2021-07-27 12:12:18.549 info (18254) Install/Update homebridge-platform-orbit
                  ham.0 2021-07-27 12:12:18.549 info (18254) Install/Update the following Libraries: homebridge-platform-orbit
                  ham.0 2021-07-27 12:12:18.535 info (18254) starting. Version 4.0.2 in /opt/iobroker/node_modules/iobroker.ham, node: v12.21.0, js-controller: 3.2.16
                  ham.0 2021-07-27 12:12:14.795 info (17370) Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason
                  ham.0 2021-07-27 12:12:14.794 info (17370) terminating
                  ham.0 2021-07-27 12:12:14.748 info (17370) cleaned everything up...

                  M Offline
                  M Offline
                  MichaR
                  schrieb am zuletzt editiert von
                  #19

                  Hallo, niemand mit einer Idee die mir helfen kann?

                  1 Antwort Letzte Antwort
                  0
                  • T tazdevil20

                    Hi,

                    nach ein paar Schwierigkeiten mit dem Gerät habe ich es halbwegs zufriedenstellend gelöst.
                    Das nur mal nebenbei: Ich habe den Filter ausgebaut und einen Dichtring ohne Filter eingesetzt. Danach haben meine Sprinkler wieder annähernd das gemacht was sie sollten. Problem ist bei mir, dass der Wasserdruck nicht so hoch ist.

                    Das zusätzliche Script zu dem Bedienen ist für meine Bedürfnisse fertig. Ist ganz sicher nicht wirklich gut gebaut und ist auch vieles "geklaut", da ich von Websocket keine Ahnung habe.

                    Es müssen ein paar Parameter manuell im Script gesetzt werden und die Objekte in ioBroker werden auch nicht automatisiert erstellt.

                    Ich habe nur die Dinge herausgepickt welche für mich interessant sind.

                    Es darf natürlich jeder das Script verbessern :blush:

                    EDIT: Habe das Script angepasst um die Historie des Ventils komplett auszulesen und als JSON in ein Objekt zu schreiben.
                    EDIT2: Da ich gerade dran bin. Kleine Verbesserung des History-JSON (saubere Sortierung wenn mehrfach am Tag eingeschaltet und Laufzeit nicht in Dezimal dargestellt)

                    /*
                     * orbit.js
                     *
                     * unofficial Orbit Bhyve API module
                     * Bill Church - https://github.com/billchurch/bhyve-mqtt
                     *
                     */
                    
                    //todo implement https://github.com/websockets/ws/wiki/client-auto-reconnect-with-ping-listener---exponential-back-off-timeout
                    
                    const axios = require('axios')
                    const EventEmitter = require('events').EventEmitter
                    const inherits = require('util').inherits
                    const WebSocket = require('ws')
                    const Ajv = require('ajv')
                    let ts = () => new Date().toISOString()
                    
                    var mCLIENT_ONLINE = false
                    var MCLIENT_ONLINE = false
                    var DevicesJSON, WateringJSON, device_id, feed;
                    var obj = [];
                    var objtmp = [];
                    
                    // ************************************************************
                    var man_deviceID = 'Die Device ID des Ventils (zu finden z. B. hier https://techsupport.orbitbhyve.com)'
                    var man_email = 'Orbit eMail-Adresse hier eintragen!'
                    var man_password = 'Orbit Passwort hier eintragen'
                    var wateringJSON_iobroker = 'javascript.0.bHyve.Watering_JSON';
                    // ************************************************************
                    
                    function minTommss(minutes){
                     var sign = minutes < 0 ? "-" : "";
                     var min = Math.floor(Math.abs(minutes));
                     var sec = Math.floor((Math.abs(minutes) * 60) % 60);
                     return sign + (min < 10 ? "0" : "") + min + ":" + (sec < 10 ? "0" : "") + sec;
                    }
                    
                    function Client () {
                      if (!(this instanceof Client)) { return new Client() }
                      EventEmitter.call(this)
                    
                      this.config = {
                        wssURL: undefined,
                        baseURL: undefined,
                        timeout: undefined,
                        email: undefined,
                        password: undefined,
                        debug: undefined
                      }
                      this._token = undefined
                      this._user_id = undefined
                      this._device_id = undefined
                    }
                    inherits(Client, EventEmitter)
                    
                    // first step, get a token and generate an event on success or fail
                    Client.prototype.connect = function (cfg) {
                      this.config.baseURL = cfg.baseURL || 'https://api.orbitbhyve.com'
                      this.config.timeout = cfg.timeout || 10000
                      this.config.email = cfg.email || undefined
                      this.config.password = cfg.password || undefined
                      this.config.wssURL = cfg.wssURL || 'wss://api.orbitbhyve.com/v1/events'
                        this.config.wsTimeout = cfg.wsTimeout || 10000
                      this.config.debug = cfg.debug || true
                      var self = this
                    
                      const getOrbitToken = () => {
                        return new Promise((resolve, reject) => {
                          const instance = axios.create({
                            baseURL: self.config.baseURL,
                            timeout: self.config.timeout
                          })
                          instance.post('/v1/session', {
                            'session': {
                              'email': self.config.email,
                              'password': self.config.password
                            }
                          }).then(function (response) {
                            self._token = response.data.orbit_session_token
                            self._user_id = response.data.user_id
                            // config for later sessions
                            self._rest_config = { baseURL: self.config.baseURL, timeout: self.config.timeout, headers: { 'orbit-session-token': self._token } }
                            //if (self.config.debug) log(`${ts()} - response.data: ` + JSON.stringify(response.data))
                            resolve(response)
                          }).catch(function (err) {
                            reject(err)
                          })
                        })
                      }
                    
                      const doAccept = (response) => {
                        //if (self.config.debug) log(`${ts()} - token: ` + self._token + ' My UserID: ' + self._user_id)
                        self.emit('token', self._token)
                        self.emit('user_id', self._user_id)
                      }
                      const doReject = (err) => {
                        if (self.config.debug) log(`${ts()} - error ` + err)
                        self.emit('error', err)
                      }
                    
                      let ost = getOrbitToken()
                      ost.then(doAccept)
                        .catch(doReject)
                    }
                    
                    Client.prototype.devices = function () {
                      var self = this
                    
                      const getDevices = () => {
                        return new Promise((resolve, reject) => {
                          const instance = axios.create(self._rest_config)
                          
                          instance.get('/v1/devices?user_id=' + self._user_id)
                            .then(function (response) {
                              if (self.config.debug) {
                                //log(`${ts()} - response.json: ` + JSON.stringify(response.data))
                                DevicesJSON = response.data
                              } 
                              self._device_id = response.data[0].id
                              device_id = response.data[1].id
                              
                              resolve(response)
                            }).catch(function (err) {
                              reject(err)
                            })
                    
                            instance.get('/v1/watering_events/' + man_deviceID)
                            .then(function (response_watering) {
                                //log(`${ts()} - response.json - watering_events: ` + JSON.stringify(response.data))
                                WateringJSON = response_watering.data
                    
                                for (var i = 0; i < Object.keys(WateringJSON).length; i++) {
                                    objtmp = [];
                                    for (var j = 0; j < Object.keys(WateringJSON[i].irrigation).length; j++) {
                                        let watering_start = formatDate(WateringJSON[i].irrigation[j].start_time, 'DD.MM. hh:mm');
                                        let watering_runtime =  minTommss(parseFloat(Number(parseFloat(WateringJSON[i].irrigation[j].run_time)).toFixed(2)));
                                        let watering_liter = parseFloat(Number((WateringJSON[i].irrigation[j].water_volume_gal)*3.78541).toFixed(2));
                    
                                        feed = {Start: watering_start, Laufzeit: watering_runtime + " min",Liter: watering_liter}
                                        if(j==0) {
                                            objtmp.push(feed);
                                        } else {
                                            objtmp.unshift(feed);
                                        }
                                    };
                                    obj = obj.concat(objtmp)
                                };
                                setState(wateringJSON_iobroker, JSON.stringify(obj));
                                //resolve(response_watering)
                            }).catch(function (err) {
                              //reject(err)
                            })
                        })
                      }
                    
                      const doAccept = (response) => {
                        //if (self.config.debug) console.log(`${ts()} - response.data2: ` + JSON.stringify(response.data))
                        self.emit('devices', response.data)
                        self.emit('device_id', self._device_id)
                      }
                    
                      const doReject = (err) => {
                        if (self.config.debug) log(`${ts()} - error: ` + err)
                        self.emit('error', err)
                      }
                    
                      let Devices = getDevices()
                      Devices.then(doAccept)
                        .catch(doReject)
                    }
                    
                    Client.prototype.send = function (message) {
                      var self = this
                    
                      self._stream.send(JSON.stringify(message))
                      log('send json: ' + JSON.stringify(message))
                    }
                    
                    Client.prototype.connectStream = function () {
                      var self = this
                    
                      self._stream = new WebSocket(self.config.wssURL, {
                        handshakeTimeout: self.config.wsTimeout
                      })
                    
                      function sendPing() {
                        if (self.config.debug) log(`${ts()} - websocket sending ping`)
                        self._stream.send('{"event":"ping"}')
                        log("ping")
                      }
                    
                      const authenticate = () => {
                        let message = {
                          'event': 'app_connection',
                          'orbit_session_token': self._token
                        }
                    
                        if (self.config.debug) log(`${ts()} - websocket authenticate message: ` + JSON.stringify(message))
                    
                        self._stream.send(JSON.stringify(message))
                        setInterval(sendPing, 25 * 1000)
                      }
                    
                      self._stream.on('open', authenticate)
                    
                      self._stream.on('message', function (data) {
                        self.emit('message', JSON.parse(data))
                      })
                    
                      self._stream.on('error', function (err) {
                        self.emit('error', err)
                      })
                    
                      self._stream.on('close', function (num, reason) {
                        if (self.config.debug) log(`${ts()} - close: ` + num + ' reason: ' + reason)
                      })
                    
                      self._stream.on('ping', function (data) {
                        if (self.config.debug) log(`${ts()} - ping data: ` + data)
                      })
                    
                      self._stream.on('unexpected-response', function (request, response) {
                        console.error(`${ts()} - unexpected-response / request: ` + request + ' response: ' + response)
                      })
                    }
                    
                    //Vorbereitung für Login
                    var oClient = Client();
                    
                    //Login
                    oClient.connect({
                        email: man_email,
                        password: man_password
                    });
                    
                    //get Token
                    oClient.on('token', (token) => {
                      //if (MCLIENT_ONLINE) mClient.publish('bhyve/alive', ts(), publishHandler)
                      //console.log(`${ts()} - Token: ${token}`)
                    })
                    
                    oClient.on('user_id', (userId) => {
                      //console.log(`${ts()} - user_id: ${userId}`)
                      oClient.devices()
                    })
                    
                    oClient.on('device_id', (deviceId) => {
                      //console.log(`${ts()} - device_id: ${deviceId}`)
                    })
                    
                    oClient.on('devices', (data) => {
                        var objects = JSON.parse(JSON.stringify(DevicesJSON))
                        objects.forEach(function(key, index){
                            //log("Name: " + key.name); 
                            //log("Type: " + key.type);
                            //log("Firmware-Version: " + key.firmware_version);
                            //log("Hardware-Version: " + key.hardware_version);
                            if(key.type == "bridge") {
                                //log("Last connect: " + key.last_connected_at);
                            };
                            //log("MAC: " + key.mac_address);
                            //log("Connected: " + key.is_connected);
                            if(key.type == "sprinkler_timer") {
                                //log("Run-Mode: " + key.status.run_mode);
                                //log("Battery: " + key.battery.percent);
                                setState('javascript.0.bHyve.Battery', key.battery.percent);
                            }
                        });
                    });
                    
                    
                    HauWi112H Offline
                    HauWi112H Offline
                    HauWi112
                    schrieb am zuletzt editiert von
                    #20

                    @tazdevil20
                    Habe mich ewig mit HAM und den beiden verfügbaren Plugins (platform-orbit und orbit-irrigation) rumgeärgert. Zum Schluss habe ich jede Stunde die HAM-Instanz neu gestartet.

                    Dann habe ich dein Script probiert... funktioniert exakt, einwandfrei und zuverlässig. Ich brauche jedoch andere Ventil-Infos (z.b. "in use")

                    Wie/Wo muss ich das Skript anpassen?
                    Wo ist das key.batttery.percent definiert?

                    Vielen Dank im Voraus!

                    T 1 Antwort Letzte Antwort
                    0
                    • HauWi112H HauWi112

                      @tazdevil20
                      Habe mich ewig mit HAM und den beiden verfügbaren Plugins (platform-orbit und orbit-irrigation) rumgeärgert. Zum Schluss habe ich jede Stunde die HAM-Instanz neu gestartet.

                      Dann habe ich dein Script probiert... funktioniert exakt, einwandfrei und zuverlässig. Ich brauche jedoch andere Ventil-Infos (z.b. "in use")

                      Wie/Wo muss ich das Skript anpassen?
                      Wo ist das key.batttery.percent definiert?

                      Vielen Dank im Voraus!

                      T Offline
                      T Offline
                      tazdevil20
                      schrieb am zuletzt editiert von
                      #21

                      @hauwi112
                      Hallo,
                      sorry, nicht mitbekommen, dass hier eine Nachricht an mich ging.
                      Einfach in dem Bereich (ab Zeile 251)

                      oClient.on('devices', (data) => {
                          var objects = JSON.parse(JSON.stringify(DevicesJSON))
                          objects.forEach(function(key, index){
                              //log("Name: " + key.name); 
                      

                      ein

                      oClient.on('devices', (data) => {
                          var objects = JSON.parse(JSON.stringify(DevicesJSON))
                      log(objects)
                          objects.forEach(function(key, index){
                      

                      einfügen. Dann siehst Du welche Daten in dem JSON kommen und kannst diese dann entsprechend auslesen.

                      Ich selbst bin dieses Jahr auf die Zigbee-Variante von Parkside (Lidl) umgestiegen. Daher werde ich an dem Script nichts mehr anpassen.

                      1 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      361

                      Online

                      32.5k

                      Benutzer

                      81.7k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe