Siri @home

Hallo,

bin auch fleissig am basteln ;0) hat zufällig jemand schon hm rolladenaktoren und Pluwgwise Stecker eingebunden. Wenn ja kann mal einer die .rb posten ? Ich kriegs nicht hin.

Danke

Andreas

Schau mal, es gibt ein Homematic Plugin GitHub - hobbyquaker/siriproxy-homematic: [deprecated] A Plugin for Siriproxy: Control Homematic Devices via Siri
Vielleicht kannst dir daraus was basteln.

Danke dir :0)

Hatte ich schon gesehen. Leider werde ich da auch nicht schlau draus :frowning:

Ciao

Andreas

Hallo Andreas,

was hast Du denn bis jetzt gemacht? Wo hakt es denn genau?

Joachim

P.S.: Bin hier seit Stunden dabei herauszufinden warum „replace“ nicht funktioniert…jemand doch noch eine Idee?

Hallo Joachim,

ich hab mal versucht die Plugwise Stecker zu integrieren

require 'httparty'

class SiriProxy::Plugin::IPS < SiriProxy::Plugin
  attr_accessor :host

  def initialize(config = {})
    self.host = config["host"]
  end

  #capture light status
  listen_for(/Licht.*Aquarium.*an/i) { licht_aquarium_on }
  listen_for(/Licht.*Aquarium.*aus/i) { licht_aquarium_off }

  #capture jalousie status
  listen_for(/Rolladen.*Schlafzimmer.*oeffnen/i) { rolladen_schlafzimmer_hoch }
  listen_for(/Rolladen.*Schlafzimmer.*schliessen/i) { rolladen_schlafzimmer_runter }


  def licht_aquarium_on
    Thread.new {
 result = HTTParty.get("http://#{self.host}/user/siri/siri.php?type=PW&id=11948&state=1")
       say "Das Licht im Aquarium ist an."
    request_completed #always complete your request! Otherwise the phone will "spin" at the user!
    }
  end

  def licht_aquarium_off
    Thread.new {
 result = HTTParty.get("http://#{self.host}/user/siri/siri.php?type=PW&id=11948&state=0")
       say "Das Licht im Aquarium ist aus."
    request_completed #always complete your request! Otherwise the phone will "spin" at the user!
    }
  end

end

Meine Siri.php


<?php

include("C:\IP-Symcon\scripts\PW_Include.ips.php");

$id = intval($_GET['id']);
$type = $_GET['type'];
$state = $_GET['state'];
    
// Plugwise
if ($type == "PW")
{
    if ($state == 1) {
    PW_SwitchMode($id, "STATE", true);
    } elseif ($state == 0) {
    PW_SwitchMode($id, "STATE", false);
    } else {
}

// Variable setzen
if ($type == "VAR")
{
    SetValue($id, $state);
}

}

?>

Klappt aber nicht … und bei Homematic habe ich überhaupt keine Idee :0(

Gruss

Andreas

Wie geil ist das denn … habs gerade nochmal getestet … jetzt gehts schonmal an… :0D

ausschalten klappt aber nicht :frowning: Ne idee ?

VG

Andreas

…was sagt denn das Siri-Protokoll im Putty?

Joachim

[Info - iPhone] Received Object: SpeechPacket
[Info - iPhone] Received Object: FinishSpeech
[Info - Guzzoni] Received Object: SpeechRecognized
[Info - Plugin Manager] Processing 'Licht Aquarium aus '
[Info - Plugin Manager] Processing plugin #<SiriProxy::Plugin::Example:0x17fcc70>
[Info - Plugin Manager] Processing plugin #<SiriProxy::Plugin::IPS:0x1a2e480>
[Info - Plugin Manager] Matches (?i-mx:Licht.*Aquarium.*aus)
[Info - Plugin Manager] Applicable states:
[Info - Plugin Manager] Current state:
[Info - Plugin Manager] Matches, executing block
[Info - Plugin Manager] Say: Das Licht im Aquarium ist aus.
[Info - Plugin Manager] Sending Request Completed

füge das mal in die siriproxy-ips.rb datei am anfag unter require ‚httparty‘ ein

require ‚cora‘
require ‚siri_objects‘
require ‚pp‘

…sieht ja bis dahin alles ganz gut aus.
Was ist mit Deiner „PW_Include.ips.php“?

Ansonsten kannst Du zum Testen eine String-Variable im IPS anlegen, in der Du mal probeweise die gesendet Daten sehen kannst:
SetValueString(Dein Objekt-ID, "Status: „.$state.“ ID: „.$ID.“ Typ: ".$type);
Vielleicht kann man daran sehen woran es hängt?

Joachim

Hallo Joachim,

wie mache ich das mit deiner Abfrage ? Hab das noch nie gemacht?
Anbei nochmal die PW_Include

<?

function PW_SendCommand($cmd)
{
	$REGVAR = 52626 /*[PlugWise\Register Variable Plugwise]*/; // ID der Registervariable
	// $REGVAR = findRegVar($IPS_SELF);

	$ausgabe=strtoupper(dechex(calculate_common_crc16c($cmd)));
	$ausgabe = str_pad($ausgabe, 4 ,'0', STR_PAD_LEFT); //mit nullen auffüllen
	$cmd.= $ausgabe;
	RegVar_SendText($REGVAR,"\x05\x05\x03\x03".$cmd."\x0D\x0A");
	IPS_Sleep(300);
}

function PW_SwitchMode($InstanceID, $DeviceOn)
{
	// PRINT "PW_SwitchMode - PW Device: ".$InstanceID.", DeviceON: ".$DeviceOn;
	// IPS_LogMessage("PW_SwitchMode", "run");

   // Zum Schalten
	$id_info = IPS_GetObject($InstanceID);
	$cmd = "0017".$id_info['ObjectIdent']."0".$DeviceOn;
   PW_SendCommand($cmd);
}

// this function is used to calculate the (common) crc16c for an entire buffer
function calculate_common_crc16c($buffer)
{
    $crc16c = 0x0000;  // the crc initial value laut www.maartendamen.com
    $buffer_length = strlen($buffer);
    for ($i = 0; $i < $buffer_length; $i++)
    {
        $ch = ord($buffer[$i]);
        $crc16c = update_common_crc16c($ch, $crc16c);
    }
    return $crc16c;
}
// this function is used to calculate the (common) crc16c byte by byte
// $ch is the next byte and $crc16c is the result from the last call, or 0xffff initially
function update_common_crc16c($ch, $crc16c)
{
    $crc16c_polynomial = 0x11021;   //auch laut maartendamen
    // This comment was in the code from
    // http://www.joegeluso.com/software/articles/ccitt.htm
    // Why are they shifting this byte left by 8 bits??
    // How do the low bits of the poly ever see it?
    $ch <<= 8;
    for($i = 0; $i < 8; $i++)
    {
        if (($crc16c ^ $ch) & 0x8000)
        {
            $xor_flag = true;
        }
        else
        {
            $xor_flag = false;
        }
        $crc16c = $crc16c << 1;
        if ($xor_flag)
        {
            $crc16c = $crc16c ^ $crc16c_polynomial;
        }
        $ch = $ch << 1;
    }
    // mask off (zero out) the upper two bytes
    $crc16c = $crc16c & 0x0000ffff;
    return $crc16c;
}

/*
function pwtime2unixtime2($pwtime) {

	// Konvertiert Datumsangaben des Plugwise-Formats in Unixtime

	$year = hexdec(substr($pwtime,0,2));
	$month = hexdec(substr($pwtime,2,2));
	$minutes = hexdec(substr($pwtime,4,4));
	// date_default_timezone_set('UTC');
	return mktime(0, $minutes, 0, $month, 0,$year);
	// date_default_timezone_set('Europe/Berlin');
	// $utcDateTime = date("c",mktime(0, $minutes, 0, $month, 0,$year));
	// date_default_timezone_set("Europe/Berlin");
   // return strtotime($utcDateTime);
}
*/

function pwtime2unixtime($pwdate) {

	// Konvertiert Plugwise Zeit in lokale Zeit und gibt den Timestamp zurück

	$jahr = 2000+hexdec(substr($pwdate,0,2));
	$monat =hexdec(substr($pwdate,2,2));
	$stunden = (hexdec(substr($pwdate,4,4))/60);
	$min=(hexdec(substr($pwdate,4,4))%60);
	$tag=floor(1+($stunden/24));
	$h = ($stunden%24);
	$offsetgmt = (date("Z")/3600);             // Offset zur GMT in Stunden
	return mktime($h + $offsetgmt, $min, 0, $monat, $tag, $jahr);
}

function bintofloat($in)
{
    $in=hexdec($in);
      $binary = str_pad(decbin($in),32,"0", STR_PAD_LEFT);
    $fb = $binary[0];
    $exp = bindec(substr($binary, 1, 8));
    $m = bindec(substr($binary, 9, 23));
    return pow(-1,$fb) * (1+$m/(pow(2,23))) * pow(2,$exp-127);
}


/*
function pulsesToKwh($value, $offRuis, $offTot, $gainA, $gainB) {
		if ($value == hexdec("FFFFFFFF")) {
			return 0;
		} else {
			$pulses = (((pow($value + $offRuis, 2.0) * $gainB) + (($value + $offRuis) * $gainA)) + $offTot);
			$result = $pulses / 3600 / 468.9385193;
			return $result;
		}
	}
*/

function pulsesToKwh($value, $offRuis, $offTot, $gainA, $gainB) {
        if ($value == hexdec("FFFFFFFF")) {
            return 0;
        } else {
           $value = $value / 3600;
            $pulses = (pow(($value + $offRuis), 2) * $gainB) + (($value + $offRuis) * $gainA) + $offTot;
            $result = (($pulses / 3600) / 468.9385193)*3600;
            return $result;
        }
    }

function findRegVar($id) {
	foreach(IPS_GetChildrenIDs(IPS_GetParent($id)) as $item){   // alle Unterobjekte durchlaufen
		$id_info = IPS_GetObject($item);
		if ($id_info["ObjectType"] == 1){
			// Instanz gefunden
			$myInstance = IPS_GetInstance($item);
			if ($myInstance["ModuleInfo"]["ModuleID"] == "{F3855B3C-7CD6-47CA-97AB-E66D346C037F}") {
				// Instanz ist eine Register Variable
				return $item;
			}
		}
	}
}

?>

Hallo Andreas,

in Deinem Funktionsaufruf hast Du drei Parameter ($ID, „STATE“, true):

PW_SwitchMode($id, "STATE", true);

Deine Funktion erwartet aber nur zwei:

function PW_SwitchMode($InstanceID, $DeviceOn) 

Versuche es daher mal so:

if ($state == 1) {
    PW_SwitchMode($id, "1");
    } elseif ($state == 0) {
    PW_SwitchMode($id, "0");
    } 

(Wobei die „0“ bzw. die „1“ eher eine Vermutung ist (habe kein HM).)

Joachim

Hallo Leute,

nach Stunden der Suche habe ich hier etwas zu dem „Replace-Problem“ gefunden.

Was dort in der Siriproxy-ips.rb programmiert wird ist wohl doch kein „Python“ sondern „Ruby“??

Ich habe versucht die dort offerierte Lösung umsetzen, bekomme aber eine Fehlermeldung. Wo muss die dort beschriebene Klasse eingefügt werden??

Joachim

Nachtrag: ICH HABE ES HINBEKOMMEN!!! Einfach programm = programm.tr(’ ‚,‘_’)
Wie einfach die Welt doch sein kann…:smiley:

Hallo Joachim,

danke für deinen Tip :0) Hab mir schon fast gedacht das das raus muss ;0) leider bin auf dem Gebiet noch nicht so der Profi … werds nachher gleich mal ausprobieren.

Hast du auch das Problem, dass wenn du Siri was sagst es läuft. Wenn du dann aber nochmal nen Befehl gibts er hängen bleibt bei [Info - iPhone] Received Object: FinishSpeech
Wenn ich dann nochmal den Befehl sage läuft es wieder. Aber wie gesagt immer nur beim zweiten mal.

Ciao

Andreas

Hallo Andreas,

der von Dir beschriebene Fehler wurde schon in diesem, möglicherweise aber auch anderen Thread - auf jeden Fall aber in diesem Forum - diskutiert, bzw. bestätigt… (ich bin gerade unterwegs und kann nicht so leicht danach suchen)

Schau Dir mal an, wie an andere Stelle in Deinem IPS dieser Funktionsaufruf durchgeführt wird (PW_SwitchMode).
Ggf. postest Du es noch mal…

Viel Erfolg!

Joachim

habe das gleiche problem wie du und werde aber aus den einträgen hier im aktuellen thread nicht schlau mit der änderung in den dsnmasq wo der user audi2012 auf seinen windows rechner verlinkt??

danke alex

Hat schon jemand ein Run-Control-Script für das Verzeichnis init.d fertig, mit dem man SiriProxy starten kann?

Und könnte es einmal posten? Das ist für mich zu kompliziert.

Ich habe diese Frage auch mal im
Thema: Siri Proxy auf Rasberry Pi

gestellt, da ich nicht weiss, ob das dort auch gelesen wird.

Hallo,

selbst noch nicht getestet, aber hier relativ unten steht eine Anleitung.

Gruß Thomas

Ist das in dem fertigen RasbPi Image nicht schon drin!?

Das ist für meine Linux-Kenntnisse schon wieder zu kompliziert. Ich wollte nach dem Weg, den Thorsten9 im Post 114 aufgezeigt hat und für mich deutlich war, vorgehen, muste aber schon bei der Modifikation des Skeletin-Scriptes auf SiriProxy passen.
Meine Hoffnung war, dass vielleicht irgendjemand diesen Script gebaut hat.:mad: – Denn im Kopieren bin ich Klasse.