Neues Frontend: FhemNative Updates

Begonnen von Syrex-o, 16 Juli 2019, 14:50:24

Vorheriges Thema - Nächstes Thema

Syrex-o

ZitatDas ist kein Wunder: websocket in FHEMWEB wird bisher ausschliesslich fuer die Benachrichtigung verwendet, Befehle werden nicht ausgewertet.
Ich setzte auf mein TODO das zu aendern, und werde hier in diesem Thread und in Ankuedigungen Bescheid geben.
Sehr schön zu hören.
Ich würde ungern jedes mal einen Ajax request senden. Außerdem muss dann CORS erlaubt sein.

ZitatEine Abfrage ala jsonlist2 aller Geraete per MQTT ist (mW z.Zt.) in FHEM nicht implementiert, ob das sinnvoll ist, bin ich unsicher.
Ob das die beste Lösung ist bin ich auch nicht sicher. so lässt sich jedoch vermeiden, dass auf alle Änderungen gehört wird und dass die Abfrage beim start länger dauert.
Eine Alternative, die mir eingefallen ist:
  Bei jeder Definition/Änderung/Löschen einer Komponente in FhemNative wird das Device im lokalen Speicher vermerkt. Dann könnte beim App start auf diese Liste gewartet werden.
  Ich bin noch nicht begeister davon, lasse mich aber gern belehren.

ZitatMQTT_GENERIC_BRIDGE bietet (nach passende Konfiguration) eine Benachrichtigung bei Aenderungen in beide Richtungen an.
Und genau da tue ich mich schwer. Wie würde das aussehen.

ZitatWas genau ist damit gemeint?
Da ich alle Devices am Anfang einmal von Fhem hole, wird die Liste der Geräte auf die zu hören ist immer mit dieser Referenz Liste verglichen. Keine Übereinstimmung = Kein Websocket command.
Anschließend wird die Liste der "listendevices" überprüft. dort werden nur die Geräte gesammelt, die in der App benutzt werden.

Grüße

Gorbi

#31
Zitat
Hast du den max Wert auf 254?
Falls ja, dann liegt es sicher an einem Logikfehler bei Werten über 100 (hab ich noch nie probiert gehabt).

Jep max Wert ist auf 254

Zitat
Steht schon auf meiner Liste. Habe ich gestern auch bemerkt. Wird behoben  ;D

Kein Problem. Kommt beim nächsten Update mit in die Label Komponente.


Sehr schön

Ein Fehler habe ich bisher noch gefunden. Habe 3 verschiedene Thermostat Komponenten auf einer Raum Seite. Sobald ich am ersten Thermostat den Wert ändere wird bei allen anderen die Farbanimation wie beim ersten angepasst. Ändere ich den Wert an den anderen beiden Thermostaten wird zwar der richtige Wert richtung fhem gesendet aber das Farblevel bleibt wie beim ersten Thermostat. Anbei mal ein Screenshot zur Veranschaulichung.

Gruß

Syrex-o

ZitatEin Fehler habe ich bisher noch gefunden. Habe 3 verschiedene Thermostat Komponenten auf einer Raum Seite. Sobald ich am ersten Thermostat den Wert ändere wird bei allen anderen die Farbanimation wie beim ersten angepasst. Ändere ich den Wert an den anderen beiden Thermostaten wird zwar der richtige Wert richtung fhem gesendet aber das Farblevel bleibt wie beim ersten Thermostat. Anbei mal ein Screenshot zur Veranschaulichung.

Das liegt sicher an der ID von svg.
Da werde ich einen unique Key generieren lassen. Hatte das selbe Problem bei der Chart Komponente.

Ist mit aufgenommen  :D

Danke für das Feedback.

Grüße

rudolfkoenig

Ab sofort fuehrt FHEMWEB das, was per websocket ankommt, als FHEM Befehl aus. Das Ergebnis wird als ein JSON Array mit einem Wert zurueckgesendet, damit es kompatibel zum bisherigen notify Format ist. Achtung: ich habe nur wenig getestet!

Fuer MQTT2_SERVER plane ich eine vergleichbare Funktionalitaet.

Fuer MQTT_GENERIC_BRIDGE Hilfe bitte im passenden Forumsbereich fragen, ich habe es bisher nicht verwendet.

Syrex-o

Zitat von: rudolfkoenig am 21 Juli 2019, 12:27:37
Ab sofort fuehrt FHEMWEB das, was per websocket ankommt, als FHEM Befehl aus. Das Ergebnis wird als ein JSON Array mit einem Wert zurueckgesendet, damit es kompatibel zum bisherigen notify Format ist. Achtung: ich habe nur wenig getestet!

Fuer MQTT2_SERVER plane ich eine vergleichbare Funktionalitaet.

Fuer MQTT_GENERIC_BRIDGE Hilfe bitte im passenden Forumsbereich fragen, ich habe es bisher nicht verwendet.

Das ging aber schnell  ;D
Gibt es dafür eine Syntax in send() als json String ?

rudolfkoenig

Bei send ist es kein Json, nur String.
Beispiel mit fhemweb / JavaScript Console:
FW_pollConn.send("jsonlist2 lampe");
FW_pollConn.send("set lampe on");
Funktioniert nur, wenn longpoll auf websocket steht (Voreinstellung).

Syrex-o

Zitat
FW_pollConn.send("jsonlist2 lampe");
FW_pollConn.send("set lampe on");

Funktioniert super.
Habe jetzt soweit umgebaut, dass beide WebSockets unterstützt werden.

Das Update kommt noch diese Woche.

Syrex-o

@rudolfkoenig
Die Fhemweb Websocket ist jetzt auch addressierbar.
Folgendes ist mir aufgefallen:
Wenn ich Anworten der websocket erhalte, dann kann ich nicht kategorisieren um was es sich handelt.
Alles ist eine "message"
Ich kategorisiere also alles nach der Länge der Antwort und dem "Arg"

get Befehle geben nur die Antwort zurück und nicht das device. Somit kann ich nicht sagen, wo die Antwort hin gehört.

bei get Befehlen bekomme ich nur manchmal eine Antwort.

@Gorbi
Die Bugs von dir sollten behoben sein.
Labels können nun auch Readings lesen.
Außer das Label beim Circle Slider. Da muss ich mir noch was einfallen lassen.

Grüße

JoeALLb

Puh, Websockets funktionieren scheinbar auch ohne Authentifizierung, jedenfalls kann ich mit dieser App auch ohne diese extern connecten und
somit Befehle absetzen??!? :-\ UNd das Client-Zertifikat kann ich in der App ja nicht angeben....
Habe Clientzertifikat-basierte Autentifizierung configuriert, und schütze die Websockets jetzt einsttweilen per Firewall (Es dürfen nur verbindungen aufgebaut werden, wenn vorher eine gültige https-verbindung aufgebaut wurde.). Das hat den Nachteil, dass ich zuvor den Browser vor der App öffnen muss...
Wie macht ihr das? Oder hab ich irgendwo einen Denkfehler?
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

rudolfkoenig

ZitatWenn ich Anworten der websocket erhalte, dann kann ich nicht kategorisieren um was es sich handelt.
Die Antworten (Array mit einem Wert) kommen immer direkt als Antwort auf einem Befehl, egal ob set oder get.
Manche Module implementieren asynchrone Antworten, was per Event (Array mit 3 Werten, s.u) gesendet wird.
Dafuer muss man sich als "Inform-Kanal" registrieren, d.h. beim Aufruf URL Parameter setzen:inform=type=status;filter=allowed;since=1564041191.1899998;fmt=JSONMoegliche Sub-Parameter:
- fmt: JSON / old
- type: status / raw- filter: devspec
- withLog: 1/0 (raw Events + FHEM-Log inhalt)
(Nich alle Kombinationen sind getestet/erlaubt).
Eine Asynchrone get Antwort kommt als["#FHEMWEB:w","FW_okDialog('ANTWORTTEXT')",""]

ZitatPuh, Websockets funktionieren scheinbar auch ohne Authentifizierung
Die FHEMWEB websockets pruefen die zugeordnete allowed Authentifizierung (gerade geprueft)
Achtung: Safari sendet (mW immer noch) keine Authorization Headerzeile bei websocket, d.h. mit Safari kann man mit aktivierten allowed keine websocket Verbindung zu FHEM aufbauen. Eine Option waere fuer Safari Benutzername/Passwort separat abzufragen und zu uebertragen. Habe aber noch keinen bis zu ende gedachten Plan.

ToM_ToM

Hallo Syrex-o,

ich wollte jetzt auch mal die ersten Tests mit deiner App starten. Die Verbindung zu FHEM bekommt er auch aufgebaut. Nur leider sagt er immer dass er das Device nicht finden konnte. Habe es mit mehreren ausprobiert.
Hast du eine Idee woran das liegen könnte?

VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

JoeALLb

Zitat von: rudolfkoenig am 25 Juli 2019, 10:12:15
Achtung: Safari sendet (mW immer noch) keine Authorization Headerzeile bei websocket, d.h. mit Safari kann man mit aktivierten allowed keine websocket Verbindung zu FHEM aufbauen.
Darum nutze ich allowed hier nicht, sondern Client-Zertifikate,
die dann direkt im nginx den Zugang erlauben oder nicht.
Hier ist wohl die NGINX-Config im Wiki nicht vollständig genug (bezüglich Websocket) ? Muss ich mir genauer ansehen.

Zitat von: rudolfkoenig am 25 Juli 2019, 10:12:15
Eine Option waere fuer Safari Benutzername/Passwort separat abzufragen und zu uebertragen. Habe aber noch keinen bis zu ende gedachten Plan.

FYI noch eine andere Möglichkeit:
Hier im Abschnitt "Fixing compatibility with iOS/Safari"
https://blog.christophermullins.com/2017/04/30/securing-homeassistant-with-client-certificates/
wird das ganze per eingefügtem Cookie gemacht.
Wenn das Cookie existiert, könnte man eventuell auf die Prüfung von allowed im Websocket selbst verzichten?!?

Aber geprüft habe ich das auch nicht!

sG
Joe
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Syrex-o

Zitat von: ToM_ToM am 25 Juli 2019, 10:26:21
Hallo Syrex-o,

ich wollte jetzt auch mal die ersten Tests mit deiner App starten. Die Verbindung zu FHEM bekommt er auch aufgebaut. Nur leider sagt er immer dass er das Device nicht finden konnte. Habe es mit mehreren ausprobiert.
Hast du eine Idee woran das liegen könnte?

VG, Thomas

Hey,
Entscheidend sind immer die Ports
Für Option Websocket im Menü auf Port 8080 achten, siehe Doku.
Bei Fhemweb musst du den normalen Fhem Port nehmen, Default: 8083

Grüße

ToM_ToM

#43
ZitatEntscheidend sind immer die Ports
Für Option Websocket im Menü auf Port 8080 achten, siehe Doku.

Das habe ich gemacht. Er connected ja auch zu FHEM. Nur die Devices will er nicht anzeigen.

Was mir allerdings unklar ist, ist der folgende Satz in der Beschreibung.
set attr longpull to websocket (from App Version >= 0.9.5)
Wo soll ich das setzen?

Meine FHEMWEB stehen alle auf WebSocket. In den Devices die ich durch dein Modul angelegt habe, gibt's kein Attribut "longpull".
Oder meinst du in der App? Dort steht es auf WebSocket.

List von wsPort

Internals:
   CONNECTS   7
   DEF        8080 global
   FD         39
   FUUID      5d39600d-f33f-762f-8c94-71039163c96da54f
   NAME       wsPort
   NOTIFYDEV  global
   NR         1047
   NTFY_ORDER 50-wsPort
   PORT       8080
   STATE      Initialized
   TYPE       websocket
   global     global
   port       8080
   READINGS:
     2019-07-25 10:21:30   state           Initialized
   onclose:
     HASH(0x9334588):
       arg:
         FUUID      5d396022-f33f-762f-9aa4-b80792f9f657e66b
         IODev      wsPort
         NAME       wsPort_json
         NOTIFYDEV 
         NR         1048
         NTFY_ORDER 50-wsPort_json
         STATE      ???
         TYPE       websocket_json
         resource   /
         typeSubscriptions:
         websockets:
   onopen:
     HASH(0x9334588):
       arg:
         FUUID      5d396022-f33f-762f-9aa4-b80792f9f657e66b
         IODev      wsPort
         NAME       wsPort_json
         NOTIFYDEV 
         NR         1048
         NTFY_ORDER 50-wsPort_json
         STATE      ???
         TYPE       websocket_json
         resource   /
         typeSubscriptions:
         websockets:
Attributes:
   DbLogExclude .*
   room       SYSTEM->Fhem



List von wsPort_json

Internals:
   FUUID      5d396022-f33f-762f-9aa4-b80792f9f657e66b
   IODev      wsPort
   NAME       wsPort_json
   NOTIFYDEV 
   NR         1048
   NTFY_ORDER 50-wsPort_json
   STATE      ???
   TYPE       websocket_json
   resource   /
   typeSubscriptions:
   websockets:
Attributes:
   DbLogExclude .*
   IODev      wsPort
   room       SYSTEM->Fhem

VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

Syrex-o

Aktuell gibt es immer 2 Events in der App.
1. Connected
2. Fetched all devices

Erst das 2. Event bestätigt, dass alle Geräte von fhem geholt worden sind.

Wenn du die Option Websocket benutzen willst ist 8080 der richtige Port.
Steht etwas in deinen fhem Log?

Wenn du Fhemweb benutzen willst, musst du fhem updaten (Fhemweb.pl)
Dann beim devices WEB das attr longpull auf Websocket setzten.
Dann ist der Port 8083.

Grüße