FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: hess am 02 Mai 2015, 23:50:56

Titel: FHEM4PEBBLE
Beitrag von: hess am 02 Mai 2015, 23:50:56
Die neue Pebble.js kann Ajax und JSON... genug Boardmittel um mit dem FHEM Webserver zu kommunizieren.
Ich hab da mal nen netten Test geschrieben:

https://github.com/re4jh/fhem4pebble

Meine Lichtschalter gehen schonmal mit der Sache.

Momentan sogar noch in unter 100 LOC :-)
Titel: Antw:FHEM4PEBBLE
Beitrag von: blueberry63 am 04 Mai 2015, 11:44:08
Hallo Jonas,

könntest eine kurze Anleitung schreiben, wie man das Ganze installieren muß? Ich wäre sehr interessiert an solch einer Lösung.

Danke und Gruß
Blueberry63
Titel: Antw:FHEM4PEBBLE
Beitrag von: hess am 04 Mai 2015, 22:21:53
Ich hab noch ein paar Erklärungen egänzt:

https://github.com/re4jh/fhem4pebble/blob/master/README.md

Fazit:

app.js in die IDE laden (CloudPebble geht auch); auf den eigenen FHEM HOST anpassen; kompilieren; auf die Pebble laden und nutzen.
Titel: Antw:FHEM4PEBBLE
Beitrag von: blueberry63 am 05 Mai 2015, 16:41:52
Ich habe es über CloudPebble probiert, aber das Compilieren bricht mit Fehlern ab:


Setting top to                           : /tmp/tmp4_98fh
Setting out to                           : /tmp/tmp4_98fh/build
Checking for program gcc,cc              : arm-none-eabi-gcc
Checking for program ar                  : arm-none-eabi-ar
Found Pebble SDK in : /app/sdk2/Pebble
'configure' finished successfully (0.172s)
Waf: Entering directory `/tmp/tmp4_98fh/build'
[ 1/13] pebble-js-app.js: src/apps.js -> build/pebble-js-app.js
[ 2/13] appinfo.auto.c: appinfo.json -> build/appinfo.auto.c
[ 3/13] app_resources.pbpack.table: ../../app/sdk2/Pebble/tools/pbpack_meta_data.py -> build/app_resources.pbpack.table
[ 4/13] app_resources.pbpack.manifest: ../../app/sdk2/Pebble/tools/pbpack_meta_data.py -> build/app_resources.pbpack.manifest
[ 5/13] app_resources.pbpack.data: ../../app/sdk2/Pebble/tools/pbpack_meta_data.py -> build/app_resources.pbpack.data
[ 6/13] app_resources.pbpack: build/app_resources.pbpack.manifest build/app_resources.pbpack.table build/app_resources.pbpack.data -> build/app_resources.pbpack
[ 7/13] resource_ids.auto.h: ../../app/sdk2/Pebble/tools/generate_resource_code.py build/app_resources.pbpack.data -> build/src/resource_ids.auto.h
[ 8/13] c: build/appinfo.auto.c -> build/appinfo.auto.c.8.o
[ 9/13] cprogram: build/appinfo.auto.c.8.o -> build/pebble-app.elf
/app/sdk2/arm-cs-tools/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol main; not setting start address
[11/13] report-memory-usage: build/pebble-app.elf
[11/13] pebble-app.raw.bin: build/pebble-app.elf -> build/pebble-app.raw.bin
app memory usage:
=============
Total footprint in RAM:            134 bytes / ~24kb
Free RAM available (heap):       24442 bytes

[12/13] inject-metadata: build/pebble-app.raw.bin build/pebble-app.elf build/app_resources.pbpack.data -> build/pebble-app.bin
Waf: Leaving directory `/tmp/tmp4_98fh/build'
Build failed
Traceback (most recent call last):
  File "/app/sdk2/Pebble/.waf-1.7.11-04343383b3a9511074383c51ae32d355/waflib/Task.py", line 123, in process
    ret=self.run()
  File "/app/sdk2/Pebble/.waf-1.7.11-04343383b3a9511074383c51ae32d355/waflib/Task.py", line 47, in run
    return m1(self)
  File "/app/sdk2/Pebble/.waf-1.7.11-04343383b3a9511074383c51ae32d355/waflib/extras/pebble_sdk.py", line 132, in inject_data_rule
    inject_metadata.inject_metadata(tgt_path,elf_path,res_path,timestamp,allow_js=has_jsapp,has_worker=(worker_elf_file is not None))
  File "/app/sdk2/Pebble/.waf-1.7.11-04343383b3a9511074383c51ae32d355/waflib/extras/inject_metadata.py", line 124, in inject_metadata
    raise Exception("Missing app entry point! Must be `int main(void) { ... }` ")
Exception: Missing app entry point! Must be `int main(void) { ... }`

[ERROR   ] A compilation error occurred

Hast Du eine Idee, was hier falsch läuft?

Gruß
Blueberry63
Titel: Antw:FHEM4PEBBLE
Beitrag von: hess am 09 Mai 2015, 00:43:41
Deine Log-Auszüge sehen sehr nach der SDK-Variante mit C als Programmiersprache aus.
Das Programm ist aber in JS (genauer: für die Pebble.js)
Titel: Antw:FHEM4PEBBLE
Beitrag von: blueberry63 am 10 Mai 2015, 10:03:00
@Jonas,

jetzt hat der Build funktioniert  :D

Mein FHEMWEB ist nicht durch Password geschützt. Funktioniert die Verbindung von der Pebble trotzdem?

Gruß
Blueberry63
Titel: Antw:FHEM4PEBBLE
Beitrag von: hess am 10 Mai 2015, 18:59:17
Hab dir mal schnell ne passwortlose Variante geschnitzt:

https://github.com/re4jh/fhem4pebble/blob/passwordless/app.js
Titel: Antw:FHEM4PEBBLE
Beitrag von: blueberry63 am 10 Mai 2015, 21:06:11
@Jonas,

ich habe die Version direkt ausprobiert, aber ich bekomme immer noch nichts auf der Pebble angezeigt: nach "connecting..." bleibt das Display leer (?)

Im Event Monitor ist allerdings auch kein Verbindungsaufbau zu sehen.
Hast Du noch eine Idee?

Gruß
Blueberry63
Titel: Antw:FHEM4PEBBLE
Beitrag von: deluxe41 am 11 Mai 2015, 13:35:03
Hallo,

Ich habe auch versucht die app auf meiner pepple zum laufen zu bringen...bei mir zeigt sich das selbe Phänomen(connecting....).

Ich habe beide Varianten probiert.


Sent from my iPhone using Tapatalk
Titel: Antw:FHEM4PEBBLE
Beitrag von: onkel-tobi am 29 Mai 2015, 17:08:32
Hi,
Habe auch die passwordless app ausprobiert, aber nach connecting bleibt auch bei mir das Display leer.

Gruß,
Tobi


Gesendet von iPhone mit Tapatalk
Titel: Antw:FHEM4PEBBLE
Beitrag von: Macshrek am 03 Juli 2015, 12:40:16
Hallo Zusammen,

habe ebenfalls FHEM4Pebble erfolgreich installiert, gleichwohl bleibt die Anzeige nach dem Connecting leer !?

Gibt es denn noch keine Ideen, Vorschläge zur Lösung ?
Scheitert die APP evtl. an einer zu komplexen FHEM Menüstruktur?

Beste Grüße

Macshrek
Titel: Antw:FHEM4PEBBLE
Beitrag von: jluitz am 09 Juli 2015, 22:33:12
Hallo Alle,

ausgehend von Jonas' Code habe ich mir eine app.js für meine Bedürfnisse gebastelt. Der Original-Code funktioniert offensichtlich nur für eine reine HM Installation. Meine Lösung war dass ich dem jsonlist mitgebe, dass es mir einmal Resultate für meine HM Schalter und dann für meine IT Schalter zurückliefert. Falls jemand meinen Code ausprobieren möchte hänge ich ihn einfach an.

lg
  Joachim
Titel: Antw:FHEM4PEBBLE
Beitrag von: deluxe41 am 10 Juli 2015, 00:32:44
Hallo jluitz

deine Klappt bei mir schonmal...
Bloß es werden bei mir bei den HM Komponenten alle Channels angezeigt, hat du ne Ahnung wie ich es weiter Filtern könnte ?


Sent from my iPhone using Tapatalk
Titel: Antw:FHEM4PEBBLE
Beitrag von: jluitz am 10 Juli 2015, 10:22:00
Hallo deluxe,

schick mir als PM das Ergebnis des jsonlist Aufrufs aus dem Browser. Dann kann ich mir das anschauen.

lg
Titel: Antw:FHEM4PEBBLE
Beitrag von: blueberry63 am 14 Juli 2015, 16:28:45
Hallo Joachim,

bei mir funktioniert es jetzt auch, SUPER!

Wenn man viele Devices hat, ist das Finden und Auswählen ziemlich mühselig. Deshalb meine Frage: könnte man in der app.js optional einen "room" (z.Bsp: "Pebble") vorgeben, in den man in FHEM die Devices gesteckt, die man mit der Pebble steuern möchte?

Gruß
Blueberry63
Titel: Antw:FHEM4PEBBLE
Beitrag von: jluitz am 14 Juli 2015, 17:47:53
Hallo Blueberry63,

das klappt leider so nicht. Das jsonlist Modul liefert bei der derzeitigen Abbrage (cmd=jsonlist+CUL_HM) nur "name" und "state" zurück. Damit kommt die Pebble ganz gut zurecht - auch bei einer umfangreichen Liste an Devices.
Die ursprüngliche fhem4pebble fragt die gesamte Liste ab - aber wie weiter oben vermutet wurde - hängt sich dann das ganze auf. Ich nehme an, dass die Pebble mit einem so grossen Hash nicht mehr zurechtkommt.

Damit das für dieses Scenario funktionieren kann müssen wir wohl ausgehend von der jsonlist ein modul stricken damit wir die notwendigen Infos zurückbekommen. Das ist auch gar nicht schwer und muss sowieso gemacht werden, da ja in der Doku steht, dass:
Note: the old command jsonlist (without the 2 as suffix) is deprecated and will be removed in the future
und die jsonlist2 liefert für <typespec> ja nichts zurück.

Dann könnten auch die ganzen Filter-Wünsche dort hineingepackt werden. Das wäre vielleicht in Hinblick auf eine universelle Pebble app, die nicht nur für CUL_HM und IT funktioniert, auch ganz vernünftig.

Ich muss leider jetzt beruflich verreisen - vielleicht komme ich nach meiner Rückkehr dazu.

lg
  Joachim
Titel: Antw:FHEM4PEBBLE
Beitrag von: blueberry63 am 15 Juli 2015, 20:00:34
Hallo Joachim,

ich will keinen Druck machen. Das ja schon prima so.

Danke
Blueberry63
Titel: Antw:FHEM4PEBBLE
Beitrag von: Thargor am 16 Juli 2015, 09:43:34
Hallo zusammen,

wollte nur mal kundtun, dass ich nun auch FHEM4Pebble auf der Uhr habe. Testen kann ich es aber erst heute abend. Die Idee ist auf jeden Fall klasse!

Gruß Lars
Titel: Antw:FHEM4PEBBLE
Beitrag von: jluitz am 26 Juli 2015, 16:33:48
Hallo Interessierte!

blueberry's Wunsch nach Devices aus nur einem bestimmten Raum habe ich folgendermassen realisiert:

Das nachfolgende Modul 98_Pebble.pm (das ist quasi eine für mich angepasste jsonlist.pm) liefert alle Devices eines bestimmten Raumes, die als state entweder "on" oder "off" haben. Das funktioniert dann mit der ebenfalls folgenden app.js (zumindest für mich) ganz brauchbar. Vielleicht kann sonst noch jemand damit etwas anfangen.

lg
  Joachim

mein 98_Pebble.pm Modul

################################################################
# examples:
# pebble        - returns name and state of all switches
# jsonlist room- returns name and state of all switches in room 'room'
################################################################

package main;
use strict;
use warnings;
use POSIX;

sub CommandPebble($$);
sub JsonEscape($);
sub PrintHashJson($$);


#####################################
sub
Pebble_Initialize($$)
{
  my %lhash = ( Fn=>"CommandPebble",
                Hlp=>"[<devspec>|<devtype>|rooms],list definitions and status info or rooms as JSON" );
  $cmds{pebble} = \%lhash;
}


#####################################
sub
JsonEscape($)
{
  my $a = shift;
  return "null" if(!$a);
  my %esc = (
    "\n" => '\n',
    "\r" => '\r',
    "\t" => '\t',
    "\f" => '\f',
    "\b" => '\b',
    "\"" => '\"',
    "\\" => '\\\\',
    "\'" => '\\\'',
  );
  $a =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/eg;
  return $a;
}

#####################################
sub
PrintHashJson($$)
{
  my ($h, $lev) = @_;
  return if($h->{PrintHashJson});

  my $hc = keys %{$h};
  my @str;
  foreach my $c (sort keys %{$h}) {

    my $str = "";
    if(ref($h->{$c})) {
      if(ref($h->{$c}) eq "HASH" && $c ne "PortObj") {
        if($c eq "IODev" || $c eq "HASH") {
          $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, JsonEscape($h->{$c}{NAME}));
        } else {
          $str .= sprintf("%*s\"%s\": {\n", $lev, " ", $c);
          if(keys(%{$h->{$c}}) != 0) {
            $h->{PrintHashJson} = 1;
            $str .= PrintHashJson($h->{$c}, $lev+2);
            delete($h->{PrintHashJson});
          } else {
            $str .= sprintf("%*s\"null\": \"null\"\n", $lev+4, " ");
          }
          $str .= sprintf("%*s}", $lev, " ");
        }
      } elsif(ref($h->{$c}) eq "ARRAY") {
        $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, "ARRAY");
      } elsif($c eq "PortObj") {
        $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, "PortObj");
      }
    } else {
      $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, JsonEscape($h->{$c}));
    }
    push @str, $str if($str);
  }

  return join(",\n", @str) . "\n";
}

#####################################
sub
CommandPebble($$)
{
  my ($cl, $param) = @_;
  my $lt = "";
  my $str = "";

  # Text indentation
  my $lev = 2;

  # Search for given device-type
  my %rooms;
  foreach my $d (keys %attr) {
    my $r = $attr{$d}{room};
    map { $rooms{$_} = 1 } split(",", $r) if($r && $r ne "hidden");
  }
  my @rooms = sort keys %rooms;

#  my @devs = grep { $param eq $attr{$_}{room} } keys %defs;

  if(@rooms) {
    my $lt = "";
    my $ld = "";
    # Result counter
    my $c = 0;

    # Open JSON object
    $str .= "{\n";
    $str .= sprintf("%*s\"%s\": \"%s\",\n", $lev, " ", "ResultSet", "room#$param");
    # Open JSON array
    $str .= sprintf("%*s\"%s\": [", $lev, " ", "Results");

    # Sort first by type then by name
   for my $d (sort { my $x = $modules{$defs{$a}{TYPE}}{ORDER} cmp
                               $modules{$defs{$b}{TYPE}}{ORDER};
                         $x = ($a cmp $b) if($x == 0); $x; } keys %defs) {
      if( $defs{$d}{STATE} eq "on" || $defs{$d}{STATE} eq "off" ) {
        if ( $attr{$d}{room} =~ m/$param/ )  {
        my $t = $defs{$d}{TYPE};
        $str .= sprintf("\n%*s},",$lev+2, " ") if($d ne $ld && $lt ne "");
        $str .= sprintf("\n%*s{",$lev+2, " ");
        $str .= sprintf("\n%*s\"name\": \"%s\",",$lev+4, " ", $d);
        $str .= sprintf("\n%*s\"state\": \"%s\"",$lev+4, " ", $defs{$d}{STATE});
        $lt = $t;
        $ld = $d;
        $c++;
      }
     }
    }

    $str .= sprintf("\n%*s}\n",$lev+2, " ");
    # Close JSON array
    $str .= sprintf("%*s],\n", $lev, " ");
    # Result summary
    $str .= sprintf("%*s\"%s\": %s\n", $lev, " ", "totalResultsReturned", $c);
    # Close JSON object
    $str .= "}";
  }
  return $str;
}
1;


meine neue app.js
/* FHEM4PEBBLE
   Source: https://github.com/re4jh/fhem4pebble
   
   modified by jluitz to work with the
   correspondig module 98_pebble.pm
*/

//FHEM HOST SETTINGS HERE
var scheme = 'http';
var host   = '192.168.0.21';
var port   = '8083';
var room   = 'Pebble'

// Import the UI elements
var UI = require('ui');

// Import the AJAX elements
var IT = require('ajax');
var Vector2 = require('vector2');

//Splashscreen
// Show splash screen while waiting for data
var splashWindow = new UI.Window();

// Text element to inform user
var text = new UI.Text({
  position: new Vector2(0, 0),
  size: new Vector2(144, 168),
  text:'FHEM connecting...',
  font:'GOTHIC_28_BOLD',
  color:'black',
  textOverflow:'wrap',
  textAlign:'center',
  backgroundColor:'white'
});

// Add to splashWindow and show
splashWindow.add(text);
splashWindow.show();

//create menu
var menu = new UI.Menu({
  sections: [{
    title: 'Switches'
  }]
});


IT(
  {
    url: scheme + '://' + host  + ':' + port  + '/fhem?cmd=pebble+' + room + '&XHR=1',
    type: 'json'
    //headers: {'Authorization': 'Basic DEMOAUTHHERE000000=='}
  },
  function(data, status, request) {
    splashWindow.hide();
    menu.show();
    //console.log('json: ' + JSON.stringify(data));
    var aDevices = data.Results;
    var myMenuPos = menu.items(0).length;
    for(var i = 0; i < aDevices.length; i++) {
          var myAlias = aDevices[i].name;
          var myShorterAlias = myAlias;
          var myNextState = 'on';
          if (aDevices[i].state=='on') myNextState = 'off';
          menu.item(0, myMenuPos, {
            title: myShorterAlias,
            subtitle: 'State:' +  aDevices[i].state,
            state_next: myNextState,
            state_current: aDevices[i].state,
            switch_name:  aDevices[i].name,
            switch_url: scheme + '://' + host  + ':' + port  + '/fhem?XHR=1&cmd.' + aDevices[i].name + '=set%20' + aDevices[i].name + '%20' + myNextState
          });
          console.log('switch found:' + aDevices[i].name);
          myMenuPos++;
        }
    var count=menu.items(0);
    console.log('Menu.length=' + count.length);
   
},
 
  function(error, status, request) {
    console.log('The ajax request failed: ' + error);
  }
);

menu.on('select', function(e) {
  IT({
    url: e.item.switch_url,
    type: 'get'
    //headers: {'Authorization': 'Basic DEMOAUTHHERE000000=='}
  });
  menu.item( e.sectionIndex,  e.itemIndex, {
      title: e.item.title,
      subtitle: 'State: ' + e.item.state_next,
      state_current: e.item.state_next,
      state_next: e.item.state_current,
      switch_url: scheme + '://' + host  + ':' + port  + '/fhem?XHR=1&cmd.' + e.item.switch_name + '=set%20' + e.item.switch_name + '%20' + e.item.state_current
  });
});
Titel: Antw:FHEM4PEBBLE
Beitrag von: blueberry63 am 30 Juli 2015, 15:30:37
@Joachim,

Das ist ja genial!!!

Ich habe es ausprobiert und für mich ist es nun völlig ausreichend.

VIELEN DANK!

Gruß
Blueberry
Titel: Antw:FHEM4PEBBLE
Beitrag von: Thargor am 30 Juli 2015, 15:37:06

Ich habe es ausprobiert, komme aber leider nicht über ein "FHEM connecting..." hinaus. IP-Adresse und Port habe ich angepasst. Hat mir jemand noch eine Idee woran es hapern könnte oder wie ich weiter nachforschen kann woran es liegt?

Vielen Dank!
Gruß Lars
Titel: Antw:FHEM4PEBBLE
Beitrag von: marcus42 am 30 Juli 2015, 17:00:35
Hast Du den Raum in FHEM angelegt?

var room   = 'Pebble'
Titel: Antw:FHEM4PEBBLE
Beitrag von: Thargor am 31 Juli 2015, 10:00:43
Ja ...
Auch der Aufruf "http://IPADRESSE:8083/fhem?cmd=pebble+Pebble&XHR=1" klappt aus dem Browser ...

Was könnte denn ein Connect verhindern?
Titel: Antw:FHEM4PEBBLE
Beitrag von: jluitz am 01 August 2015, 20:21:45
Hallo Thargor,

ich hatte das auch mal. Mein "Lösung" war Windows-artig: Pebble rebooten, fhem4pebble neu installlieren und dann ging's. Vielleicht hilft das auch bei Dir.

lg
  Joachim
Titel: Antw:FHEM4PEBBLE
Beitrag von: Thargor am 04 August 2015, 09:49:08

Hallo Joachim,

Zitat von: jluitz am 01 August 2015, 20:21:45
ich hatte das auch mal. Mein "Lösung" war Windows-artig: Pebble rebooten, fhem4pebble neu installlieren und dann ging's. Vielleicht hilft das auch bei Dir.

Vielen vielen Dank!
Das war auch mein Problem. Vielleicht lag es auch daran, dass zwar die Android App schon auf V3.2 war, aber die Pebble Time noch nicht. Wie auch immer, es geht jetzt auch bei mir und das ist absolut genial!
Titel: Antw:FHEM4PEBBLE
Beitrag von: scheisserchen65 am 04 August 2015, 15:06:12
Hallo Joachim.
Dein Script funktioniert super! Danke!!!  :D
Ich werde mal schauen ob ich es noch verbessern kann (wenn das überhaupt möglich ist  ;) )
Zum Ersten habe ich mit Cloudpebble noch ein Logo hinzu gefügt dass dann in der Pebble angezeigt wird.
Aber zuerst muss ich mich mal mit Pebble.js beschäftigen.

Gruß
Reinhard
Titel: Antw:FHEM4PEBBLE
Beitrag von: blueberry63 am 10 August 2015, 13:12:46
Hallo,

meine Programmierkenntnisse sind eher dürftig. Daher noch eine Bitte: ist es möglich auch Rollladenaktoren einzubinden?

Gruß
Blueberry63
Titel: Antw:FHEM4PEBBLE
Beitrag von: juergen012 am 12 August 2015, 13:14:17
Hallo, soeben habe ich die Pebble-App installiert. Klappt einwandfrei. Kann jetzt meine Lampen etc. über die Pebble schalten. SUPER!!!
Beste Grüße
Jürgen K.
Titel: Antw:FHEM4PEBBLE
Beitrag von: scheisserchen65 am 17 August 2015, 21:24:34
Hallo Joachim, hallo Jonas, hallo @all  ;)
Ein Kollege (blubhimself) und ich haben die FHEM4PEBBLE ein wenig erweitert.
Folgende Dinge sind bisher machbar:
- schaltet Brennenstuhl RCS 1000N/1044N
- schaltet FS20ST
- zeigt Temperatur vom FHT80b
- zeigt Status vom FHT80TF
- ist über das Smartphone (Pebble.App) auf die eigene FHEM-Server-IP und den Port anpassbar
- die Schalter/Thermostate/Kontakte werden in Gruppen aufgelistet

Auf der Pebble werden die Alias-Namen (aus FHEM) der FS20... genutzt.

Für alle die keine Lust haben in CloudPebble den Quellcode selber zu kompilieren habe ich hier die FHEM4PEBBLE.pbw und die angepasste 98_Pebble.pm angehängt.
Aussserdem habe ich noch einen 'Screenshot' der Pebble angehängt.

Gruß
Reinhard

edit: die 98_Pebble.pm hier ist nicht korrekt, erst die auf der folgenden Seite!
Titel: Antw:FHEM4PEBBLE
Beitrag von: juergen012 am 18 August 2015, 14:23:29
Hallo, zunächst mal vielen Dank für die App. Leider bekomme ich die *.pbw Datei nicht auf  meine Pebble installiert. Habe diverse Versuche unternommen. Ohne Erfolg. Kann mir Jemand einen Tip geben, wie es klappt??
Beste Grüße
Jürgen K.

Edit; habe die *pbw per e-mail Anhang verschickt. Da ließ sie sich installieren. Leider komme ich über ein FHEM verbinden... nicht hinaus. Ip adresse und Port überprüft/geändert. Ohne Erfolg
Titel: Antw:FHEM4PEBBLE
Beitrag von: scheisserchen65 am 18 August 2015, 16:24:51
Zitat von: juergen012 am 18 August 2015, 14:23:29
Hallo, zunächst mal vielen Dank für die App. Leider bekomme ich die *.pbw Datei nicht auf  meine Pebble installiert. Habe diverse Versuche unternommen. Ohne Erfolg. Kann mir Jemand einen Tip geben, wie es klappt??
Beste Grüße
Jürgen K.

Edit; habe die *pbw per e-mail Anhang verschickt. Da ließ sie sich installieren. Leider komme ich über ein FHEM verbinden... nicht hinaus. Ip adresse und Port überprüft/geändert. Ohne Erfolg

Wenn ich Dich richtig verstanden habe kommst Du auf die Konfig-Seite?
Hast Du den Port für das Phone genutzt?
Bei mir ist es 8084 und er darf nicht mit einem Passwort versehen sein.
Hast Du die 98_Pebble.pm ersetzt? (die alte vorher am Besten sichern)

Reinhard
Titel: Antw:FHEM4PEBBLE
Beitrag von: juergen012 am 18 August 2015, 17:14:52
Hallo, danke für die schnelle Antwort. Die Konfiguration habe ich mehrmals geändert. auch die Ports habe ich alle getestet. Die Pebble_98 habe ich ersetzt..
Leider ohne Erfolg
Gruß
Jürgen
Titel: Antw:FHEM4PEBBLE
Beitrag von: jluitz am 18 August 2015, 19:05:56
Vielleicht liegt es daran, dass Reinhards 98_pebble.pm kein Perl Modul ist sonder nur ein "Link" zu der Datei auf seinem samba server ;)

@Reinhard, bitte lade die richtige 98_pebble.pm hoch.

Danke
  Joachim
Titel: Antw:FHEM4PEBBLE
Beitrag von: juergen012 am 18 August 2015, 19:36:23
Habe mir auch schon die 98_Pebble auch schon angeschaut und mich gewundert..
Titel: Antw:FHEM4PEBBLE
Beitrag von: scheisserchen65 am 18 August 2015, 19:46:38
Also, hier die FHEM4PEBBLE.app
---snipp---

/* FHEM4PEBBLE
   Source: https://github.com/re4jh/fhem4pebble   
   modified by blubhimself to work with the
   correspondig module 98_pebble.pm and show up Switches, FHT and FHTTK
   modified by scheisserchen65 (german layout, configuration, logo)
*/
//FHEM HOST SETTINGS HERE
var Settings = require('settings');

// Add Event listners for Configuration Screen to set host and port
Pebble.addEventListener('showConfiguration', function(e) {
    // Show config page
  Pebble.openURL('http://scheisserchen65.homedns.org/config.htm');
});

Pebble.addEventListener('webviewclosed', function(e) {
    console.log('Configuration window returned: ' + e.response);
var configuration = JSON.parse(decodeURIComponent(e.response));
    Settings.option('host', configuration.host);
    Settings.option('port', configuration.port);
});
var scheme = 'http';
  //var host   = '192.168.1.243';
var host = Settings.option('host');
  //var port   = '8084';
var port = Settings.option('port');
  //var room   = 'Pebble';
// Import the UI elements
var UI = require('ui');
// Import the AJAX elements
var IT = require('ajax');
var Vector2 = require('vector2');
// Build and Show splash screen while waiting for data
var splashWindow = new UI.Window();
// Text element to inform user
var text = new UI.Text({
  position: new Vector2(0, 0),
  size: new Vector2(144, 168),
  text:'FHEM verbinden...',
  font:'GOTHIC_28_BOLD',
  color:'white',
  textOverflow:'wrap',
  textAlign:'center',
  backgroundColor:'black'
});
// Add to splashWindow and show
splashWindow.add(text);
splashWindow.show();
//create menu
var menu = new UI.Menu({
  sections: [{title: 'Schalter'},{title: 'Thermostate'},{title: 'Fenster & Türen'}]
});
IT({url: scheme + '://' + host  + ':' + port  + '/fhem?cmd=pebble&XHR=1',
    type: 'json'
    //headers: {'Authorization': 'Basic DEMOAUTHHERE000000=='}
  },
  function(data, status, request) {       
    var aDevices = data.Results;
    var myTypes = [ "SWITCH", "FHT", "CUL_FHTTK"];
    for(var ind=0; ind<=2; ind++){
      build_item(aDevices, ind, myTypes[ind]);
    }   
    //show Menu after its loaded
    splashWindow.hide();
    menu.show();
}
); 
  //Build Devices for Menu section
  function build_item(aDevices, index, type){
    var myMenuPos = menu.items(index).length;
    for(var i = 0; i < aDevices.length; i++) {
      if(type == aDevices.typ) {
        var realAlias = aDevices.alias;
        var myNextState = 'on';
        var myStr = aDevices.state;
        var res = myStr.replace("measured-temp:", "");
        if (aDevices.state=='on') myNextState = 'off';
        if (aDevices.state=='off') myNextState = 'on';
        aDevices.state = res;
        var myRealState = 'Status: ' + aDevices.state;
        if(type == "FHT"){
          myRealState = 'Temperatur: ' + aDevices.state + '°C';
        }
        if(type == "CUL_FHTTK"){
          myRealState = 'Zustand: ' + aDevices.state;
        }
        menu.item(index, myMenuPos, {
          title: realAlias,
          subtitle: myRealState,
          state_next: myNextState,
          state_current: aDevices.state,
          switch_name: aDevices.name,
          switch_url: scheme + '://' + host  + ':' + port  + '/fhem?XHR=1&cmd.' + aDevices.name + '=set%20' + aDevices.name + '%20' + myNextState
        });
        console.log('switch found:' + aDevices.name);
        myMenuPos++;
      }
    }
   
  }
//OnClock Items in the Menu (just needed for switches)
menu.on('select', function(e) {
  IT({
    url: e.item.switch_url,
    type: 'get'
    //headers: {'Authorization': 'Basic DEMOAUTHHERE000000=='}
  });
  menu.item(0,  e.itemIndex, {
      title: e.item.title,
      subtitle: 'Status: ' + e.item.state_next,
      state_current: e.item.state_next,
      state_next: e.item.state_current,
      switch_url: scheme + '://' + host  + ':' + port  + '/fhem?XHR=1&cmd.' + e.item.switch_name + '=set%20' + e.item.switch_name + '%20' + e.item.state_current
  });
});

---snipp---
hier folgt die 98_Pebble.pm von blubhimself
---snipp---

################################################################
# examples:
# pebble        - returns name and state of all switches
# jsonlist room- returns name and state of all switches in room 'room'
################################################################

package main;
use strict;
use warnings;
use POSIX;

sub CommandPebble($$);
sub JsonEscape($);
sub PrintHashJson($$);


#####################################
sub
Pebble_Initialize($$)
{
  my %lhash = ( Fn=>"CommandPebble",
                Hlp=>"[<devspec>|<devtype>|rooms],list definitions and status info or rooms as JSON" );
  $cmds{pebble} = \%lhash;
}


#####################################
sub
JsonEscape($)
{
  my $a = shift;
  return "null" if(!$a);
  my %esc = (
    "\n" => '\n',
    "\r" => '\r',
    "\t" => '\t',
    "\f" => '\f',
    "\b" => '\b',
    "\"" => '\"',
    "\\" => '\\\\',
    "\'" => '\\\'',
  );
  $a =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/eg;
  return $a;
}

#####################################
sub
PrintHashJson($$)
{
  my ($h, $lev) = @_;
  return if($h->{PrintHashJson});

  my $hc = keys %{$h};
  my @str;
  foreach my $c (sort keys %{$h}) {

    my $str = "";
    if(ref($h->{$c})) {
      if(ref($h->{$c}) eq "HASH" && $c ne "PortObj") {
        if($c eq "IODev" || $c eq "HASH") {
          $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, JsonEscape($h->{$c}{NAME}));
        } else {
          $str .= sprintf("%*s\"%s\": {\n", $lev, " ", $c);
          if(keys(%{$h->{$c}}) != 0) {
            $h->{PrintHashJson} = 1;
            $str .= PrintHashJson($h->{$c}, $lev+2);
            delete($h->{PrintHashJson});
          } else {
            $str .= sprintf("%*s\"null\": \"null\"\n", $lev+4, " ");
          }
          $str .= sprintf("%*s}", $lev, " ");
        }
      } elsif(ref($h->{$c}) eq "ARRAY") {
        $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, "ARRAY");
      } elsif($c eq "PortObj") {
        $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, "PortObj");
      }
    } else {
      $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, JsonEscape($h->{$c}));
    }
    push @str, $str if($str);
  }

  return join(",\n", @str) . "\n";
}

#####################################
sub
CommandPebble($$)
{
  my ($cl, $param) = @_;
  my $lt = "";
  my $str = "";

  # Text indentation
  my $lev = 2;

  # Search for given device-type
  my %rooms;
  foreach my $d (keys %attr) {
    my $r = $attr{$d}{room};
    map { $rooms{$_} = 1 } split(",", $r) if($r && $r ne "hidden");
  }
  my @rooms = sort keys %rooms;

#  my @devs = grep { $param eq $attr{$_}{room} } keys %defs;

  if(@rooms) {
    my $lt = "";
    my $ld = "";
    # Result counter
    my $c = 0;

    # Open JSON object
    $str .= "{\n";
    $str .= sprintf("%*s\"%s\": \"%s\",\n", $lev, " ", "ResultSet", "room#$param");
    # Open JSON array
    $str .= sprintf("%*s\"%s\": [", $lev, " ", "Results");

    # Sort first by type then by name
   for my $d (sort { my $x = $modules{$defs{$a}{TYPE}}{ORDER} cmp
                               $modules{$defs{$b}{TYPE}}{ORDER};
                         $x = ($a cmp $b) if($x == 0); $x; } keys %defs) {
      if( $defs{$d}{STATE} eq "on" || $defs{$d}{STATE} eq "off" || $defs{$d}{TYPE} eq "FHT" || $defs{$d}{TYPE} eq "CUL_FHTTK") {
        if ( $attr{$d}{room} =~ m/$param/ )  {
       my $t = $defs{$d}{TYPE};
       if($defs{$d}{TYPE} ne "FHT"){
          my $typ = "SWITCH";
       }
      #my $attrs = getAllAttr($d);
           $str .= sprintf("\n%*s},",$lev+2, " ") if($d ne $ld && $lt ne "");
           $str .= sprintf("\n%*s{",$lev+2, " ");
           $str .= sprintf("\n%*s\"name\": \"%s\",",$lev+4, " ", $d);
                $str .= sprintf("\n%*s\"state\": \"%s\",",$lev+4, " ", $defs{$d}{STATE});
                $str .= sprintf("\n%*s\"alias\": \"%s\",",$lev+4, " ", $attr{$d}{alias});
                if($defs{$d}{TYPE} eq "FS20" || $defs{$d}{TYPE} eq "FBDECT" || $defs{$d}{TYPE} eq "IT"){
                  $str .= sprintf("\n%*s\"typ\": \"%s\"",$lev+4, " ", "SWITCH");
                }
      else {
                  $str .= sprintf("\n%*s\"typ\": \"%s\"",$lev+4, " ", $defs{$d}{TYPE});
      }
           $lt = $t;
      $ld = $d;
           $c++;
        }
     }
    }

    $str .= sprintf("\n%*s}\n",$lev+2, " ");
    # Close JSON array
    $str .= sprintf("%*s],\n", $lev, " ");
    # Result summary
    $str .= sprintf("%*s\"%s\": %s\n", $lev, " ", "totalResultsReturned", $c);
    # Close JSON object
    $str .= "}";
  }
  return $str;
}
1;

---snipp---

Ich hoffe das hilft Euch weiter.

Die Pebble.openURL('http://scheisserchen65.homedns.org/config.htm'); führt nur auf einen Server der mir gehört.
Kann jeder für sich ändern, man benötigt aber einen, ansonsten bekommt man die Konfiguration nicht hin.
Bzw. ich habe keine andere Möglichkeit (für mich) gefunden.

Gruß
Reinhard
Titel: Antw:FHEM4PEBBLE
Beitrag von: scheisserchen65 am 18 August 2015, 19:55:41
Oh, Mist, ja, sorry 1000mal   :(
Ich habe tatsächlich den blöden Link hoch geladen, ich Depp  :)

Hier nun aber die DATEI:

Sorry noch einmal  :o
Titel: Antw:FHEM4PEBBLE
Beitrag von: juergen012 am 19 August 2015, 10:12:05
Hallo!! Habe jetzt die "richtige" 98_Pebble installiert und .. die Schalter werden erkannt. SUPER. Leider kann ich meine Thermostate (LaCrosse) und die Heizungsventile (MAX) nicht sehen. Vielleicht erbarmt sich noch jemand.. ansonsten DANKE!!
Beste Grüße
Jürgen K.
Titel: Antw:FHEM4PEBBLE
Beitrag von: blueberry63 am 20 August 2015, 13:03:10
@Reinhard,

Ich habe Deine "fhem4pebble.pwb" über Cloudpebble installiert und auch die 98_Pebble.pm auf dem FHEM server. Die IP-Adresse habe ich entsprechend angepasst. Ich bekomme allerdings keine Verbindung zum Server, sondern werde auf die Pebble.app hingewiesen. Dazu habe ich noch eine Frage:

Zitat
ist über das Smartphone (Pebble.App) auf die eigene FHEM-Server-IP und den Port anpassbar

Sollte es bei der Pebble.App auf dem Smartphone Einstellmöglichkeiten geben? Da ist bei mir jedenfalls nicht der Fall.

Muß ich beim Kompilieren in Cloudpebble etwas beachten?

Gruß
Blueberry63
Titel: Antw:FHEM4PEBBLE
Beitrag von: scheisserchen65 am 20 August 2015, 14:16:40
Zitat von: blueberry63 am 20 August 2015, 13:03:10
@Reinhard,

Ich habe Deine "fhem4pebble.pwb" über Cloudpebble installiert und auch die 98_Pebble.pm auf dem FHEM server. Die IP-Adresse habe ich entsprechend angepasst. Ich bekomme allerdings keine Verbindung zum Server, sondern werde auf die Pebble.app hingewiesen. Dazu habe ich noch eine Frage:

Sollte es bei der Pebble.App auf dem Smartphone Einstellmöglichkeiten geben? Da ist bei mir jedenfalls nicht der Fall.

Muß ich beim Kompilieren in Cloudpebble etwas beachten?

Gruß
Blueberry63

Hi Blueberry63,
"Ja", du musst in Cloudpebble unter "Einstellungen" "Konfigurierbar" markieren, sonst geht die Konfiguration mit dem Smartphone nicht.

Gruß
Reinhard
Titel: Antw:FHEM4PEBBLE
Beitrag von: scheisserchen65 am 21 August 2015, 20:01:35
Und wieder was Neues:
Ab dieser Version werden auch HMS100TF erkannt und in der Pebble angezeigt.
(wie gehabt die alte 98_Pebble.pm sichern, die Neue auf den FHEM-Server speichern und die FHEM4PEBBLE.pbw auf die Pebble installieren)

@Jürgen: leider habe ich keine MAX und kann die deshalb auch nicht testen. Aber vielleicht in der Zukunft  ;)

Hier als Anlage die beiden Dateien (und nicht die Links)  :o ;D

Gruß
Reinhard
Titel: Antw:FHEM4PEBBLE
Beitrag von: blueberry63 am 22 August 2015, 09:47:14
@Reinhard,

ich habe Deine Version zwar noch nicht zum Laufen bekommen (werde mich morgen nochmal mit beschäftigen), aber ist es auch möglich, HM Rollladenaktoren einzubinden?

Gruß
Blueberry63
Titel: Antw:FHEM4PEBBLE
Beitrag von: scheisserchen65 am 22 August 2015, 10:59:06
Zitat von: blueberry63 am 22 August 2015, 09:47:14
@Reinhard,

ich habe Deine Version zwar noch nicht zum Laufen bekommen (werde mich morgen nochmal mit beschäftigen), aber ist es auch möglich, HM Rollladenaktoren einzubinden?

Gruß
Blueberry63

Bin unterwegs,  melde mich morgen  :)
Reinhard
Titel: Antw:FHEM4PEBBLE
Beitrag von: blueberry63 am 25 August 2015, 08:56:03
Hallo Reinhard,

ich habe Deine neueste Version installiert, bekomme die Geräte angezeigt, allerdings ohne Gerätenamen. Außerdem stürzt die Watchapp ab und zu ab.

Könntest Du den Source-Code der App hier posten? Dann könnte ich in Cloudpebble etwas experimentieren.

Gruß
Blueberry63
Titel: Antw:FHEM4PEBBLE
Beitrag von: scheisserchen65 am 25 August 2015, 09:42:57
Zitat von: blueberry63 am 25 August 2015, 08:56:03
Hallo Reinhard,

ich habe Deine neueste Version installiert, bekomme die Geräte angezeigt, allerdings ohne Gerätenamen. Außerdem stürzt die Watchapp ab und zu ab.

Könntest Du den Source-Code der App hier posten? Dann könnte ich in Cloudpebble etwas experimentieren.

Gruß
Blueberry63

Um die Geräte auf der Pebble sehen zu können musst Du ihnen in FHEM einen Alias Namen geben.

Hier der aktuelle Quellcode

FHEM4PEBBLE.app
-----snipp-----
/* FHEM4PEBBLE
   Source: https://github.com/re4jh/fhem4pebble   
   modified by blubhimself to work with the
   correspondig module 98_pebble.pm and schow up Switches, FHT and FHTTK
   modified by scheisserchen65 (german layout, configuration, logo)
*/
//FHEM HOST SETTINGS HERE
var Settings = require('settings');

// Add Event listners for Configuration Screen to set host and port
Pebble.addEventListener('showConfiguration', function(e) {
    // Show config page
  Pebble.openURL('http://scheisserchen65.homedns.org/config.htm');
});

Pebble.addEventListener('webviewclosed', function(e) {
    console.log('Configuration window returned: ' + e.response);
var configuration = JSON.parse(decodeURIComponent(e.response));
    Settings.option('host', configuration.host);
    Settings.option('port', configuration.port);
});
var scheme = 'http';
  //var host   = '192.168.1.243';
var host = Settings.option('host');
  //var port   = '8084';
var port = Settings.option('port');
  //var room   = 'Pebble';
// Import the UI elements
var UI = require('ui');
// Import the AJAX elements
var IT = require('ajax');
var Vector2 = require('vector2');
// Build and Show splash screen while waiting for data
var splashWindow = new UI.Window();
// Text element to inform user
var text = new UI.Text({
  position: new Vector2(0, 0),
  size: new Vector2(144, 168),
  text:'FHEM verbinden...',
  font:'GOTHIC_28_BOLD',
  color:'white',
  textOverflow:'wrap',
  textAlign:'center',
  backgroundColor:'black'
});
// Add to splashWindow and show
splashWindow.add(text);
splashWindow.show();
//create menu
var menu = new UI.Menu({
  sections: [{title: 'Schalter'},{title: 'Thermostate'},{title: 'Fenster & Türen'},{title: 'Thermo-/Hygrometer'}]
});
IT({url: scheme + '://' + host  + ':' + port  + '/fhem?cmd=pebble&XHR=1',
    type: 'json'
    //headers: {'Authorization': 'Basic DEMOAUTHHERE000000=='}
  },
  function(data, status, request) {       
    var aDevices = data.Results;
    var myTypes = [ "SWITCH", "FHT", "CUL_FHTTK", "HMS"];
    for(var ind=0; ind<=3; ind++){
      build_item(aDevices, ind, myTypes[ind]);
    }   
    //show Menu after its loaded
    splashWindow.hide();
    menu.show();
}
); 
  //Build Devices for Menu section
  function build_item(aDevices, index, type){
    var myMenuPos = menu.items(index).length;
    for(var i = 0; i < aDevices.length; i++) {
      if(type == aDevices.typ) {
        var realAlias = aDevices.alias;
        var myNextState = 'on';
        var myStr = aDevices.state;
        var res = myStr.replace("measured-temp:", "");
        if (aDevices.state=='on') myNextState = 'off';
        if (aDevices.state=='off') myNextState = 'on';
        aDevices.state = res;
        var myRealState = 'Status: ' + aDevices.state;
        if(type == "FHT"){
          myRealState = 'Temperatur: ' + aDevices.state + '°C';
        }
        if(type == "CUL_FHTTK"){
          myRealState = 'Zustand: ' + aDevices.state;
        }
        if(type == "HMS"){
          myRealState = aDevices.state;
        }
       
        menu.item(index, myMenuPos, {
          title: realAlias,
          subtitle: myRealState,
          state_next: myNextState,
          state_current: aDevices.state,
          switch_name: aDevices.name,
          switch_url: scheme + '://' + host  + ':' + port  + '/fhem?XHR=1&cmd.' + aDevices.name + '=set%20' + aDevices.name + '%20' + myNextState
        });
        console.log('switch found:' + aDevices.name);
        myMenuPos++;
      }
    }
   
  }
//OnClock Items in the Menu (just needed for switches)
menu.on('select', function(e) {
  IT({
    url: e.item.switch_url,
    type: 'get'
    //headers: {'Authorization': 'Basic DEMOAUTHHERE000000=='}
  });
  menu.item(0,  e.itemIndex, {
      title: e.item.title,
      subtitle: 'Status: ' + e.item.state_next,
      state_current: e.item.state_next,
      state_next: e.item.state_current,
      switch_url: scheme + '://' + host  + ':' + port  + '/fhem?XHR=1&cmd.' + e.item.switch_name + '=set%20' + e.item.switch_name + '%20' + e.item.state_current
  });
});
-----snipp-----
98_Pebble.pm
-----snipp-----
################################################################
# examples:
# pebble        - returns name and state of all switches
# jsonlist room- returns name and state of all switches in room 'room'
################################################################

package main;
use strict;
use warnings;
use POSIX;

sub CommandPebble($$);
sub JsonEscape($);
sub PrintHashJson($$);


#####################################
sub
Pebble_Initialize($$)
{
  my %lhash = ( Fn=>"CommandPebble",
                Hlp=>"[<devspec>|<devtype>|rooms],list definitions and status info or rooms as JSON" );
  $cmds{pebble} = \%lhash;
}


#####################################
sub
JsonEscape($)
{
  my $a = shift;
  return "null" if(!$a);
  my %esc = (
    "\n" => '\n',
    "\r" => '\r',
    "\t" => '\t',
    "\f" => '\f',
    "\b" => '\b',
    "\"" => '\"',
    "\\" => '\\\\',
    "\'" => '\\\'',
  );
  $a =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/eg;
  return $a;
}

#####################################
sub
PrintHashJson($$)
{
  my ($h, $lev) = @_;
  return if($h->{PrintHashJson});

  my $hc = keys %{$h};
  my @str;
  foreach my $c (sort keys %{$h}) {

    my $str = "";
    if(ref($h->{$c})) {
      if(ref($h->{$c}) eq "HASH" && $c ne "PortObj") {
        if($c eq "IODev" || $c eq "HASH") {
          $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, JsonEscape($h->{$c}{NAME}));
        } else {
          $str .= sprintf("%*s\"%s\": {\n", $lev, " ", $c);
          if(keys(%{$h->{$c}}) != 0) {
            $h->{PrintHashJson} = 1;
            $str .= PrintHashJson($h->{$c}, $lev+2);
            delete($h->{PrintHashJson});
          } else {
            $str .= sprintf("%*s\"null\": \"null\"\n", $lev+4, " ");
          }
          $str .= sprintf("%*s}", $lev, " ");
        }
      } elsif(ref($h->{$c}) eq "ARRAY") {
        $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, "ARRAY");
      } elsif($c eq "PortObj") {
        $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, "PortObj");
      }
    } else {
      $str .= sprintf("%*s\"%s\": \"%s\"", $lev," ",$c, JsonEscape($h->{$c}));
    }
    push @str, $str if($str);
  }

  return join(",\n", @str) . "\n";
}

#####################################
sub
CommandPebble($$)
{
  my ($cl, $param) = @_;
  my $lt = "";
  my $str = "";

  # Text indentation
  my $lev = 2;

  # Search for given device-type
  my %rooms;
  foreach my $d (keys %attr) {
    my $r = $attr{$d}{room};
    map { $rooms{$_} = 1 } split(",", $r) if($r && $r ne "hidden");
  }
  my @rooms = sort keys %rooms;

#  my @devs = grep { $param eq $attr{$_}{room} } keys %defs;

  if(@rooms) {
    my $lt = "";
    my $ld = "";
    # Result counter
    my $c = 0;

    # Open JSON object
    $str .= "{\n";
    $str .= sprintf("%*s\"%s\": \"%s\",\n", $lev, " ", "ResultSet", "room#$param");
    # Open JSON array
    $str .= sprintf("%*s\"%s\": [", $lev, " ", "Results");

    # Sort first by type then by name
   for my $d (sort { my $x = $modules{$defs{$a}{TYPE}}{ORDER} cmp
                               $modules{$defs{$b}{TYPE}}{ORDER};
                         $x = ($a cmp $b) if($x == 0); $x; } keys %defs) {
      if( $defs{$d}{STATE} eq "on" || $defs{$d}{STATE} eq "off" || $defs{$d}{TYPE} eq "FHT" || $defs{$d}{TYPE} eq "CUL_FHTTK" || $defs{$d}{TYPE} eq "HMS") {
        if ( $attr{$d}{room} =~ m/$param/ )  {
       my $t = $defs{$d}{TYPE};
      
       if($defs{$d}{TYPE} ne "FHT" || $defs{$d}{TYPE} ne "HMS" ){
          my $typ = "SWITCH";
          
                 }
      #my $attrs = getAllAttr($d);
           $str .= sprintf("\n%*s},",$lev+2, " ") if($d ne $ld && $lt ne "");
           $str .= sprintf("\n%*s{",$lev+2, " ");
           $str .= sprintf("\n%*s\"name\": \"%s\",",$lev+4, " ", $d);
                $str .= sprintf("\n%*s\"state\": \"%s\",",$lev+4, " ", $defs{$d}{STATE});
                $str .= sprintf("\n%*s\"alias\": \"%s\",",$lev+4, " ", $attr{$d}{alias});
                if($defs{$d}{TYPE} eq "FS20" || $defs{$d}{TYPE} eq "FBDECT" || $defs{$d}{TYPE} eq "IT"){
                  $str .= sprintf("\n%*s\"typ\": \"%s\"",$lev+4, " ", "SWITCH");
                }
      else {
                  $str .= sprintf("\n%*s\"typ\": \"%s\"",$lev+4, " ", $defs{$d}{TYPE});
      }
           $lt = $t;
      $ld = $d;
           $c++;
        }
     }
    }

    $str .= sprintf("\n%*s}\n",$lev+2, " ");
    # Close JSON array
    $str .= sprintf("%*s],\n", $lev, " ");
    # Result summary
    $str .= sprintf("%*s\"%s\": %s\n", $lev, " ", "totalResultsReturned", $c);
    # Close JSON object
    $str .= "}";
  }
  return $str;
}
1;
-----snipp-----
Hoffe ich konnte helfen.
Gruß
Reinhard

Titel: Antw:FHEM4PEBBLE
Beitrag von: _Markus_ am 25 September 2015, 22:12:46
Hi,

habe auf der Version aufgesetzt und sie erweitert.
Das Resultat findet ihr hier: http://forum.fhem.de/index.php/topic,41458.0.html (http://forum.fhem.de/index.php/topic,41458.0.html).

Vielleicht habt ihr Lust weiter daran zu werkeln.

VG, Markus