Newbie - Modulkommunikation | Match | JSON | diverse Zusammenhänge u. Fragen

Begonnen von HomeAuto_User, 19 Dezember 2017, 14:45:29

Vorheriges Thema - Nächstes Thema

HomeAuto_User

Hallo,
ich bin soeben dabei ein Modul zu schreiben.
Meine erste Fassung ist soweit, das sämtliche Readings aktualisiert werden.
Nun würde ich aus den Readings heraus im nächsten Schritt "Schalter" erstellen, weil es die Zustände von einem entfernten Gerät sind.
Da ich das Gerät fernsteuern möchte, so möchte ich den bisherigen Zustand verarbeiten. Da nun zum Bsp. value - off ausgelesen wird in das Reading, wo würde ich dies übernehmen in eine Schalterdefinition welche ich später zum steuern nehmen kann. In der Wiki las ich, das autocreate auf UNDEFINED "reagiert".
Es gelingt mir bisher nicht, meinen return Wert "UNDEFINED Schalter_01 Modulname Schalter_01" anzulegen.

Erbitte Hilfe.
mfG
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

Beta-User

 :o Ist das eine Anfängerfrage?

Sollte eher in den Developer-Bereich verschoben werden, oder?

Im Wiki gibt es auch ein Intro in die Entwicklung von Modulen, würde jetzt mal darauf tippen, dass die readings-update-Funktionen das sind, nach was du suchst (da sollte auch stehen, wie die readings überhaupt angelegt werden).

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

CoolTux

Ich würde das eher ins Developer Forum schreiben.

So wie Du es beschrieben hast klingt es eher nach Dispatcher. Du rufst also den Dispatcher auf und dieser ruft die entsprechende ParseFn des logischen Devices auf.
Das wäre also das Prinzip eines 2 Stufigen Modules. Ist es das was Du meinst? Alternativ schau Dir mal die 10_CUL_HM.pm an, dort wird ja auch mit Channels gearbeitet. Eventuell meinst Du eher sowas.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

HomeAuto_User

Hallo und danke für die schnelle Reaktion.
Zitat von: CoolTux am 19 Dezember 2017, 14:52:39
So wie Du es beschrieben hast klingt es eher nach Dispatcher. Du rufst also den Dispatcher auf und dieser ruft die entsprechende ParseFn des logischen Devices auf.
Genau richtig, sowas las ich auch schon. Nur lese ich heraus, das der Dispatcher auf einen Empfänger reagiert bzw. RAW Msg. Ich bekomme die Info aber von dem Modul welches die Readings automatisch aktualisiert.

Thema Verschieben? Hier kann man dies nur versenden  :)
Sollte dennoch ein Admin dies mitlesen, so kann dies ggf in Dev schieben.
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

CoolTux

Ganz unten ganz links solltest Du verschieben haben.


Da Du sicherlich alles aus einem Modul heraus machst, musst Du Dir etwas einfallen lassen. Wieso eigentlich aus Readings heraus? Beschreibe mal worum es genau geht und dann kann man auch effektive Vorschläge machen.
Im Moment denke ich an eine Bridge (IODev) welche Daten von unterschiedlichen Geräten empfängt die an der Bridge hängen und dann entsprechend Devices in FHEM von den Geräten anlegen soll. Also eigentlich die Aufgabe eines klassischen 2-stufigen Modules.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

HomeAuto_User

Es geht aktuell um diese Fortführung.
Das xs1 von EZcontrol ist ein Gerät was Sensoren und Aktoren empfangen bzw. Daten senden kann.
Da das ganze nicht mehr entwickelt wird, so dachte ich mir, verarbeite ich das ganze mal in ein Modul um dies mit FHEM nutzen zu können.

Ich lese die Zustände des Gerätes via http Abfrage aus und schreibe diese in Readings.
So kann ich das Gerät bsp. fernab von einem Empfänger hinstellen und habe via Netzwerkverbindung eine Bridge wo ich die Daten in FHEM darstellen kann.
Da man auch schalten kann, so Möchte ich die Zustände der aktoren (welche in Readings sind) nun in Aktoren schaltbar in FHEM umsetzen. Wenn Zustand aus, und man on drückt, so setze ich einen http Befehl ab um die XS1 - Aktor x zu steuern.

(Thema wurde parallel veschoben, hatte Tomaten auf den Augen  ;D)
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

CoolTux

Das xs1 von EZcontrol ist ein Gerät was Sensoren und Aktoren empfangen bzw. Daten senden kann.


Das ist das Entscheidende. Es ist eine Bridge welche Daten von anderen Geräten Empfängt. Also klassisches 2-stufiges Modul ist hier zu empfehlen.
Sofern noch nicht geschehen lese Dich ins Wiki ein und schaue Dir dort die Sektion dazu genauer an.
Es gibt diverse Module welches dieses Prinzip verwenden. Da Du sicherlich Fragen haben wirst gebe ich Dir meine Module auf den Weg mit.

73_GardenaSmartBridge.pm
74_GardenaSmartDevice.pm

73_AMADCommBridge.pm
74_AMADDevice.pm

21_HEOSPlayer.pm
21_HEOSMaster.pm
21_HEOSGroup.pm



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

HomeAuto_User

Hallo CoolTux,

Zitat von: CoolTux am 19 Dezember 2017, 15:26:44
Das xs1 von EZcontrol ist ein Gerät was Sensoren und Aktoren empfangen bzw. Daten senden kann.


Das ist das Entscheidende. Es ist eine Bridge welche Daten von anderen Geräten Empfängt. Also klassisches 2-stufiges Modul ist hier zu empfehlen.
Sofern noch nicht geschehen lese Dich ins Wiki ein und schaue Dir dort die Sektion dazu genauer an.
Es gibt diverse Module welches dieses Prinzip verwenden. Da Du sicherlich Fragen haben wirst gebe ich Dir meine Module auf den Weg mit.

....

Grüße

Vielen Dank für deine Antwort und auch für den Hinweis deiner Module.
Ich konnte mich schon ein wenig mehr "hineinfuchsen". *daumenhoch*
Sollte ich denn noch Fragen haben, so melde ich zu Wort ;-)

MfG
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

CoolTux

Freut mich das ich helfen konnte. Schreib einfach wenn Du Fragen hast.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

HomeAuto_User

Hi

Zitat von: CoolTux am 20 Dezember 2017, 19:58:56
Freut mich das ich helfen konnte. Schreib einfach wenn Du Fragen hast.

Grüße

auf deine Aussage komme ich direkt mal zurück ;-)
Ich versuche gerade mein JSON zu decoden was mir in der "ersten Stufe soweit klappt". In der 2. Stufe komme ich noch nicht weiter.

actuator
"version": 16,
"type": "get_list_actuators",
"utc_offset": 60,
"dst": "off",
"actuator": [
{
"name": "UB_FB_1",
"id": 1,
"type": "switch",
"value": 0.0,
"newvalue": 0.0,
"utime": 0,
"unit": "%",
"function": [
{
"type": "on",
"dsc": "ON"
},
{
"type": "off",
"dsc": "OFF"
},
{
"type": "disabled",
"dsc": ""
},
{
"type": "disabled",
"dsc": ""
}
]
},
{
"name": "UB_FB_2",
"id": 2,
"type": "switch",
"value": 0.0,
"newvalue": 0.0,
"utime": 0,
"unit": "%",
"function": [
{
"type": "on",
"dsc": "ON"
},
{
"type": "off",
"dsc": "OFF"
},
{
"type": "disabled",
"dsc": ""
},
{
"type": "disabled",
"dsc": ""
}
]
},
}


Ich möchte an "function" herankommen.
Mit meiner Schleife

my @array = @{ $decoded->{"actuator"} };
foreach my $f ( @array ) {
if ($f->{"type"} ne "disabled") {
print $test["type"];
}
}

gelang es mir nur für die "erste Stufe" wie actuator.
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

herrmannj

#10
das ist schon mal kein valides JSON. Wenn es JSON wäre dann wäre das Wurzelelement ein Object oder ein array.

Nehmen wir mal voller Übermut an das Dein JSON unvollständig gepostet ist, und dass das Wurzelelement ein object ist (der einem hash in perl entspricht). Dann wäre der Weg dieser:
$decoded->{'actuator'}->{'actuator'}->[0]->{'function'}
Das ergibt dann die referenz zu einem array von objecten die jeweils die keys 'type' und 'dsc' haben.

edit: wobei Du über das erste array auch loopen musst. Da wo ich nur index 0 geschrieben habe,
edit2: wer denkt sich so beknackte JSON aus ?? ;)
edit3: code angepasst (von $data auf $decoded)

CoolTux

Vielen Dank Jörg für Deine Hilfe.
Ich schließe mich da Jörg an. Unter der Voraussetzung das Du etwas unterschlagen hast kannst Du mit Jörgs Code das Element direkt ansprechen. Alternativ kannst du auch alle Arrays durchgehen.


Schau mal hier
https://raw.githubusercontent.com/LeonGaultier/fhem-SmartPi/master/46_SmartPi.pm

Du findest oben im Modul ein Beispielstring für das JSON und in der Readings Write Funktion siehst du das ich es über verschachtelte Schleifen gemacht habe.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

HomeAuto_User

Danke,
den Ansatz von dir habe ich genutzt und erhalte was als Ergebnis ;-) Da muss ich vorhin "blind" gewesen sein, da ich der Annahme war, das so schonmal probiert zu haben.

Zitat von: herrmannj am 20 Dezember 2017, 23:15:31
das ist schon mal kein valides JSON. Wenn es JSON wäre dann wäre das Wurzelelement ein Object oder ein array.

Nehmen wir mal voller Übermut an das Dein JSON unvollständig gepostet ist, und dass das Wurzelelement ein object ist (der einem hash in perl entspricht). Dann wäre der Weg dieser:
$decoded->{'actuator'}->{'actuator'}->[0]->{'function'}
Das ergibt dann die referenz zu einem array von objecten die jeweils die keys 'type' und 'dsc' haben.

edit: wobei Du über das erste array auch loopen musst. Da wo ich nur index 0 geschrieben habe,
edit2: wer denkt sich so beknackte JSON aus ?? ;)
edit3: code angepasst (von $data auf $decoded)

zu edit2: ein Hersteller, welcher nun nicht mehr weiter produziert ;-)

Es sind Arbeiten zu dem diesem Modul .
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

HomeAuto_User

Guten Abend,

mit der Hilfe von Euch kam ich schon ein sehr schönes Stück weiter!
Derzeit versuche ich durchzusehen wie die Kommunikation der beiden Module welche ich "verknüpfe" zustande kommt.
Laut Wiki spielt IOWrite() mit x_Write() zusammen und Dispatch() mit X_Parse().
Die "Kommunikation" von IOWrite() mit x_Write() ist mir gelungen das ich Zustände übertragen kann.
Mit Dispatch() zu X_Parse() habe ich noch meine Probleme. Derzeit erhalte ich vom Dispatch() unknow code ... und eine Weitergabe erfolgt nicht zur X_Parse().

Angefangen habe ich mit sub xs1Device_Parse($$)
{
my ( $io_hash, $decoded) = @_;
my $name = $io_hash->{NAME};
   
Log3 $name, 1, "xs1Device_Parse: io_hash:$io_hash Ausgabe:$decoded";
}

um einfach erstmal eine Reaktion zu sehen. Leider erhalte ich keine Logausgabe und stattdessen die MEldung unknow Code vom Dispatch (help me).
Ich vermute die Parse "springt" nicht an oder ich habe etwas undefiniert.  :o

Zitatsub xxx ()
{
...
Dispatch($hash,$decoded,undef);
}
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

CoolTux

Hast Du denn die $hash->{Match} , $hash->{MatchList} und $hash->{Clients} entsprechend eingetragen?
Schau Dir die von mir gegeben Module noch mal an.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net