Panasonic Comfort Cloud integration

@fcela Good point. There is also no way how to control nanoe via mobile app. So maybe that’s the reason.

@lefi Sure, but keep in mind, that I’m just learning openhab and python, so my solution is not optimal. But it works for me for now. Once I’ll have some free time, I would like to look at it again.
Python:

import pcomfortcloud
import sys

###### Update
import requests

headers = {
    'Content-Type': 'text/plain',
    'Accept': 'application/json',
}
#######

t_power = {
    'Power.Off': "OFF",
    'Power.On': "ON"
}
t_power_set = {
    'OFF': pcomfortcloud.constants.Power.Off,
    'ON': pcomfortcloud.constants.Power.On
}
t_mode = {
    "OperationMode.Auto": "Auto",
    "OperationMode.Dry": "Dry",
    "OperationMode.Cool": "Cool",
    "OperationMode.Heat": "Heat"
}
t_mode_set = {
    "Auto": pcomfortcloud.constants.OperationMode.Auto,
    "Dry": pcomfortcloud.constants.OperationMode.Dry,
    "Cool": pcomfortcloud.constants.OperationMode.Cool,
    "Heat": pcomfortcloud.constants.OperationMode.Heat 
}
t_eco = {
    "EcoMode.Auto": "Auto",
    "EcoMode.Powerful": "Powerful",
    "EcoMode.Quiet": "Quiet"
}
t_eco_set = {
    "Auto": pcomfortcloud.constants.EcoMode.Auto,
    "Powerful": pcomfortcloud.constants.EcoMode.Powerful,
    "Quiet": pcomfortcloud.constants.EcoMode.Quiet 
}
t_fanSpeed = {
    "FanSpeed.Auto": "Auto",
    "FanSpeed.Low": "Low",
    "FanSpeed.LowMid": "LowMid",
    "FanSpeed.Mid": "Mid",
    "FanSpeed.HighMid": "HighMid",
    "FanSpeed.High": "High",
}
t_fanSpeed_set = {
    "Auto": pcomfortcloud.constants.FanSpeed.Auto,
    "Low": pcomfortcloud.constants.FanSpeed.Low,
    "LowMid": pcomfortcloud.constants.FanSpeed.LowMid,
    "Mid": pcomfortcloud.constants.FanSpeed.Mid,
    "HighMid": pcomfortcloud.constants.FanSpeed.HighMid,
    "High": pcomfortcloud.constants.FanSpeed.High,
}
t_airSwingVertical = {
    "AirSwingUD.Auto": "Auto",
    "AirSwingUD.Up": "Up",
    "AirSwingUD.Down": "Down",
    "AirSwingUD.Mid": "Mid",
    "AirSwingUD.UpMid": "UpMid",
    "AirSwingUD.DownMid": "DownMid"
}
t_airSwingVertical_set = {
    "Auto": pcomfortcloud.constants.AirSwingUD.Auto,
    "Up": pcomfortcloud.constants.AirSwingUD.Up,
	"Down": pcomfortcloud.constants.AirSwingUD.Down,
    "Mid": pcomfortcloud.constants.AirSwingUD.Mid,
    "UpMid": pcomfortcloud.constants.AirSwingUD.UpMid,
    "DownMid": pcomfortcloud.constants.AirSwingUD.DownMid
}
t_airSwingHorizontal = {
    "AirSwingLR.Auto": "Auto",
    "AirSwingLR.Left": "Left",
	"AirSwingLR.Right": "Right",
	"AirSwingLR.Mid": "Mid",
	"AirSwingLR.RightMid": "RightMid",
	"AirSwingLR.LeftMid": "LeftMid"
}
t_airSwingHorizontal_set = {
    "Auto": pcomfortcloud.constants.AirSwingLR.Auto,
    "Left": pcomfortcloud.constants.AirSwingLR.Left,
	"Right": pcomfortcloud.constants.AirSwingLR.Right,
	"Mid": pcomfortcloud.constants.AirSwingLR.Mid,
	"RightMid": pcomfortcloud.constants.AirSwingLR.RightMid,
	"LeftMid": pcomfortcloud.constants.AirSwingLR.LeftMid
}



session = pcomfortcloud.Session('XXX@gmail.com', 'XXX', tokenFileName='~/.panasonic-token', raw=False, verifySsl=False)
session.login()


devices = session.get_devices()
status = session.get_device(devices[0]['id'])
action = sys.argv[1]
if len(sys.argv) == 2:
	print(action)
else :
	s_power = sys.argv[2]
	s_mode = sys.argv[3]
	s_ecomode = sys.argv[4]
	s_temperature = sys.argv[5]
	s_fanspeed = sys.argv[6]
	s_airswingvertical = sys.argv[7]
	s_airswinghorizontal = sys.argv[8]

if action == "set":
	session.set_device(devices[0]['id'], 
		power = t_power_set[s_power],
		temperature = s_temperature,
		mode = t_mode_set[s_mode],
		eco = t_eco_set[s_ecomode],
		fanSpeed = t_fanSpeed_set[s_fanspeed],
		airSwingVertical = t_airSwingVertical_set[s_airswingvertical],
		airSwingHorizontal = t_airSwingHorizontal_set[s_airswinghorizontal]
	)
else:
	##response = requests.put('http://myhome:8080/rest/items/Airconditioner_EcoNavi/state', headers=headers, data=econavi)
	response = requests.put('http://myhome:8080/rest/items/Airconditioner_Power/state', headers=headers, data=t_power[str(status["parameters"]["power"])])
	response = requests.put('http://myhome:8080/rest/items/Airconditioner_Sitemap/state', headers=headers, data=t_power[str(status["parameters"]["power"])])
	response = requests.put('http://myhome:8080/rest/items/Airconditioner_Mode/state', headers=headers, data=t_mode[str(status["parameters"]["mode"])])
	response = requests.put('http://myhome:8080/rest/items/Airconditioner_EcoMode/state', headers=headers, data=t_eco[str(status["parameters"]["eco"])])
	response = requests.put('http://myhome:8080/rest/items/Airconditioner_Temperature/state', headers=headers, data=str(status["parameters"]["temperature"]))
	response = requests.put('http://myhome:8080/rest/items/Airconditioner_FanSpeed/state', headers=headers, data=t_fanSpeed[str(status["parameters"]["fanSpeed"])])
	response = requests.put('http://myhome:8080/rest/items/Airconditioner_AirSwingVertical/state', headers=headers, data=t_airSwingVertical[str(status["parameters"]["airSwingVertical"])])
	response = requests.put('http://myhome:8080/rest/items/Airconditioner_AirSwingHorizontal/state', headers=headers, data=t_airSwingHorizontal[str(status["parameters"]["airSwingHorizontal"])])

Rule:

rule "AirConditioner Status Update"
when
    Time cron "0 0/30 * * * ?"
then
    executeCommandLine('sudo python /home/openhabian/.local/lib/python2.7/site-packages/airconditioner.py "state"', 2000)
end

rule "AirConditioner Manual Status Update"
when
    Item Airconditioner_Update changed to ON
then
    executeCommandLine('sudo python /home/openhabian/.local/lib/python2.7/site-packages/airconditioner.py "status"', 2000)
end

rule "AirConditioner Status"
when
    Item Airconditioner_Power received update
then
    sendCommand(Airconditioner_Update, OFF)
end

rule "AirConditioner Set"
when
    Item Airconditioner_Auto changed or
    Item Airconditioner_Power changed or
    Item Airconditioner_Mode changed or
    Item Airconditioner_EcoNavi changed or
    Item Airconditioner_EcoMode changed or
    Item Airconditioner_Temperature changed or
    Item Airconditioner_FanSpeed changed or
    Item Airconditioner_AirSwingVertical changed or
    Item Airconditioner_AirSwingHorizontal changed
then
	logInfo("AirConditioner Set", '/home/openhabian/.local/lib/python2.7/site-packages/airconditioner.py "set" "' + Airconditioner_Power.state.toString + '" "' + Airconditioner_Mode.state.toString + '" "' + Airconditioner_EcoMode.state.toString + '" "' + Airconditioner_Temperature.state + '" "' + Airconditioner_FanSpeed.state.toString + '" "' + Airconditioner_AirSwingVertical.state.toString + '" "' + Airconditioner_AirSwingHorizontal.state.toString + '"')
	executeCommandLine('sudo python /home/openhabian/.local/lib/python2.7/site-packages/airconditioner.py "set" "' + Airconditioner_Power.state.toString + '" "' + Airconditioner_Mode.state.toString + '" "' + Airconditioner_EcoMode.state.toString + '" "' + Airconditioner_Temperature.state + '" "' + Airconditioner_FanSpeed.state.toString + '" "' + Airconditioner_AirSwingVertical.state.toString + '" "' + Airconditioner_AirSwingHorizontal.state.toString + '"', 2000)
    if (Airconditioner_Power.state == OFF){
        sendCommand(Airconditioner_Status, "OFF")
        sendCommand(Airconditioner_GoogleHomeMode, "off")
    } else {
        postUpdate(Airconditioner_Status, Airconditioner_Mode.state)
        switch Airconditioner_Mode.state {
            case "Auto": {
                sendCommand(Airconditioner_GoogleHomeMode, "heatcool")
            }
            case "Cool": {
                sendCommand(Airconditioner_GoogleHomeMode, "cool")
            }
            case "Heat": {
                sendCommand(Airconditioner_GoogleHomeMode, "heat")
            }
            case "Dry": {
                sendCommand(Airconditioner_GoogleHomeMode, "dry")
            }
        }
    }
end

Items:

Switch      Airconditioner_Update               "Airconditioner Status"                 	    <switch>            (gAirconditioner)
Switch      Airconditioner_Auto                 "Airconditioner Auto"                   	    <switch>            (gAirconditioner)
Number      Airconditioner_Auto_InsideTemp      "Airconditioner Max Inside Temperature Limit"   <temperature>       (gAirconditioner)
Number      Airconditioner_Auto_OutsideTemp     "Airconditioner Min Outside Temperature Limit"  <temperature>       (gAirconditioner)
Switch      Airconditioner_Power                "Airconditioner Power"                      	<climate>           (gAirconditioner)
String      Airconditioner_Mode                 "Airconditioner Mode"                       	<text>              (gAirconditioner)
String      Airconditioner_GoogleHomeMode       "Airconditioner Google Home [%s]"               <climate>           (gAirconditioner)    [ "homekit:HeatingCoolingMode" ]
String      Airconditioner_Status               "Airconditioner [%s]"                           <climate>           (gAirconditioner)
Switch      Airconditioner_EcoNavi              "Airconditioner EcoNavi"                	    <motion>            (gAirconditioner)
String      Airconditioner_EcoMode              "Airconditioner EcoMode"                	    <fan>               (gAirconditioner)
Number      Airconditioner_Temperature          "Airconditioner Temperature"            	    <temperature>       (gAirconditioner)    [ "TargetTemperature" ]
String      Airconditioner_FanSpeed             "Airconditioner Fan Speed"              	    <fan>               (gAirconditioner)
String      Airconditioner_AirSwingVertical     "Airconditioner Air Swing Vertical"     	    <movecontrol>       (gAirconditioner)
String      Airconditioner_AirSwingHorizontal   "Airconditioner Air Swing Horizontal"   	    <movecontrol>       (gAirconditioner)
Number      Airconditioner_TADO_Temperature		"Airconditioner Tado Temperature [%.1f]"		<temperature>	    (gAirconditioner)    [ "CurrentTemperature" ] {channel="tado:zone:6fc099d4:1:currentTemperature"}
DateTime	Airconditioner_LastUpdate  			"Airconditioner Last update [%1$ta %1$tR]" 	    <time>